[elektro] OT: VB2008 soros vonal olvasás

Kovács József kj at faldeko.hu
Fri Nov 8 17:17:00 CET 2013


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.



More information about the Elektro mailing list