[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