[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