[elektro] OT: VB2008 soros vonal olvasás
Stonie
laca256 at gmail.com
Fri Nov 8 19:53:11 CET 2013
Nem kukacoskodni akarok, de kiváncsi lennék, hogy a "végtelen állapotgép"
hogyan valósítható meg, kivéve ha isteni erővel bír valaki ;)
<http://en.wikipedia.org/wiki/Finite-state_machine>
<http://www.urbandictionary.com/define.php?term=infinite%20state%20machine>
<https://infoc.eet.bme.hu/ea06.php#26>
2013/11/8 Kovács József <kj at faldeko.hu>
> Az eseménykezelős portkezelő módszer a normális, szerintem.
> Ezzel minden kézben tartható... bármi jön is be a vonalon éppen :-)
> Mert, nem mindig az jön, amit vár a zemberfijja...
>
> Én VB6-ban az OnComm eseményre szedegetem el ami jött egy saját bufferbe.
> Gondolom az újabb VB-ben is van ilyen módi ...
> (de az alá még nem kellett soros porti rutint írnom)
>
>
> Az eseményt karakterenként kérem el a port-tól.
> Azaz RThreshold=1 a beállítás.
> Így minden érkező karakterről rögtön tudok :-)
>
> A vett karakterekből egy saját pufferben építkezem
> a port esemény kezelője által hajtva.
>
> A komplett vételt egy végtelen állapotgép oldja meg.
> Ami kezeli a nyűgöket, time out-tal figyeli a vonalat
> és validálja ami jön, csak a várt formátumot fogadva el.
> Ami itt: <szöveg>CRC alakú
>
> A kapcsolat folymatos meglétét egy szívhang rutinnal ellenőrzöm.
> Azaz egy timer adott időnként (nálam 1 sec)
> ír a portra és várja time out-on belül a választ.
> Így kiderül, ha eltűnt az eszköz ...
>
> MSComm1.CommPort = 2
> 'MSComm1.Settings = "57600,N,8,1"
> MSComm1.RThreshold = 1
> MSComm1.InputLen = 1
> MSComm1.PortOpen = True
>
> --------------
> Private Sub MSComm1_OnComm()
>
> Dim Getkar_uart1 As String
>
> If MSComm1.CommEvent = comEvReceive Then
> 'DoEvents
>
> Getkar_uart1 = MSComm1.Input
>
> Select Case Status_uart1
> Case 0
> 'Nem fogad
>
> Case 99
> 'Var a feldolgozasra
>
> Case 10
> 'Var a < karakterre
> If Getkar_uart1 = "<" Then
> Puffer_uart1 = Space(30)
> Erkezett_uart1 = 0
> Timeout_uart1 = 100
> Status_uart1 = 20
> End If
>
> Case 20
> 'Gyujtoget, vagy hibara fut
> If Timeout_uart1 = 0 Then
> 'Nem vegzett idoben
> Status_uart1 = 10
> ElseIf Erkezett_uart1 = Maxkar_uart1 Then
> 'Tul sok jott > nelkul
> Status_uart1 = 10
> ElseIf Getkar_uart1 = "<" Then
> 'Rosszkor jott < karakter
> Status_uart1 = 10
> ElseIf Getkar_uart1 = ">" Then
> 'Itt a vege,meg kell a CRC
> Status_uart1 = 30
> Else
> 'Gyujtogeti a karaktereket
> Erkezett_uart1 = Erkezett_uart1 + 1
> Mid(Puffer_uart1, Erkezett_uart1, 1) = Getkar_uart1
> End If
>
> Case 30
> 'CRC-re var
> Crc_uart1 = Getkar_uart1
> Timeout_uart1 = 0
> Status_uart1 = 99
> txtComComplete = IIf(txtComComplete = "<>", "--", "<>")
> 'szívhang pislogó írása
> End Select
>
> End If
>
> End Sub
> --------------
>
> 'szívhang
>
> Private Sub Timer1_Timer()
>
> If Szivhang = 0 Then
> Label38.BackColor = vbRed
> txtSzivhang.BackColor = vbRed
> Else
> Szivhang = Szivhang - 1
> Label38.BackColor = &HC000&
> txtSzivhang.BackColor = &HC000&
> End If
>
> If Kivar > 0 Then
> Kivar = Kivar - 1
> End If
>
>
> End Sub
>
> -------------------------
>
> És a főrutin, ami ez esetben egy CNC távvezérlőé...
> Egy végtelen állapotgép formájában megvalósítva.
>
> Sub MainLoop()
>
> SysTimeIr
>
> Write_Position
>
> If Status_uart1 = 99 Then
> Stdummy = Puffer_uart1
>
> Stdummy = RTrim(Stdummy)
> Bdummy = Len(Stdummy)
>
> Stdummy = UCase(Stdummy)
> lblMessage = Stdummy
>
> Parancs_1 = Left(Stdummy, 2)
> Param_1 = Mid(Stdummy, 3)
>
> Status_uart1 = 10
>
> End If
>
> If Parancs_1 = "*" Then
> Szivhang = 100
> txtSzivhang = IIf(txtSzivhang = "<>", "--", "<>")
> End If
>
> If Parancs_1 = "ND" Then
> Beep
> PgMode = Pg_stop
> End If
>
> If Parancs_1 = "LN" Then
> Debug.Print Param_1
> End If
>
> 'Program letoltes...
> If PgMode = Pg_auto Then
>
> Select Case Status_letolt
>
> Case 0
> If Parancs_1 = "RE" Then
> Status_letolt = 10
> MSComm1.Output = "<PS00001> "
> End If
>
> Case 10
> 'Letoltes Mbuffer teleig vagy CNCtomb vegegig
> If Parancs_1 = "L?" Then
> If Param_1 <= UBound(CNCtomb) Then
> PRGindex = Param_1
> Call PDout(CNCtomb(PRGindex))
>
> If UBound(CNCtomb) > 99 And PRGindex = 99 Then
> Status_letolt = 20
> End If
>
> If UBound(CNCtomb) <= 99 And PRGindex =
> UBound(CNCtomb) Then
> Status_letolt = 20
> End If
>
> End If
> End If
>
>
> Case 20
> Kivar = 10
> Status_letolt = 21
>
> Case 21
> If Kivar = 0 Then
> Status_letolt = 22
> End If
>
> Case 22
> MSComm1.Output = "<MS> "
>
> If PRGindex <> UBound(CNCtomb) Then
> Status_letolt = 30
> Else
> Status_letolt = 40
> End If
>
> Case 30
> 'Letoltes a CNCtomb vegeig
> If Parancs_1 = "L?" Then
> If Param_1 <= UBound(CNCtomb) Then
> PRGindex = Param_1
> Call PDout(CNCtomb(PRGindex))
> Else
> 'Program vege
> 'MSComm1.Output = "<PE> "
> Status_letolt = 50
> End If
> End If
>
> Case 40
> 'Program vege
> 'MSComm1.Output = "<PE> "
> Status_letolt = 50
>
> Case 50
> 'Semmi...
> Status_letolt = 50
>
> End Select
>
> End If
>
> DoEvents
>
> End Sub
>
>
>
> 2013.11.08. 15:59 keltezéssel, potyo írta:
> > Ezt nézted már?
> > http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.aspx
> >
> > Első blikkre a ReadByte metódus kellene neked, esetleg előtte lekérdezve
> a
> > BytesToRead tulajdonságát az objektumnak, hogy megtudd, van-e egyáltalán
> > mit olvasni.
> >
> > Esetleg megnézheted a DataReceived eseményt is. Ha jól értem, akkor ez
> arra
> > való, hogy ha jön valami, akkor ez meghívódik - de lehet, hogy ez mondjuk
> > csak akkor, ha jött mondjuk VbCr.
> >
> >
> > 2013. november 8. 15:52 hozso_001 at freemail.hu írta, <
> hozso_001 at freemail.hu>:
> >
> >> Megint elakadtam...
> >>
> >> Eddig csak küldözgettem ki az adatokat a soros vonalra,
> >> megy is szépen. Nos, most olvasnom kellene.
> >> Olvasgattam mintákat, de nekem eléggé zavaros a dolog.
> >> Annyit értek, hogy a soros vonal olvasás egy külön thread-ben
> >> fut. Próbáltam az adatok kiküldése után adott ideig várakozva
> >> olvasni a portról ReadLine-al, de ez nem adja vissza a teljes
> >> puffer tartalmat.
> >>
> >> Ez alapján:
> >>
> >>
> >>
> http://code.msdn.microsoft.com/windowsdesktop/SerialPort-Sample-in-VBNET-fb040fb2
> >>
> >> Írja is, hogy ez akkor működik (mármint a ReadLine), ha a
> >> vett byte-ok között ott van a VbCr. Gondolom, addig olvas,
> >> amíg meg nem találja a megadott karaktert.
> >>
> >> Van-e módom arra, hogy a soros vonal pufferét egyben,
> >> "szőröstül-bőröstül" beolvassam?
> >>
> >>
> >> Üdv.: Horváth Zsolt
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >> -----------------------------------------
> >> elektro[-flame|-etc]
> >>
> > -----------------------------------------
> > elektro[-flame|-etc]
> >
> > -----
> > A(z) üzenetben nem található vírus.
> > Ellenőrizte: AVG - www.avg.com
> > Verzió: 2013.0.3426 / Vírus adatbázis: 3222/6818 - Kiadás dátuma:
> 2013.11.07.
>
> -----------------------------------------
> elektro[-flame|-etc]
More information about the Elektro
mailing list