TheFuture
23-01-2005, 15:46
Ciao a tutti, devo realizzare un'applicazione in VB6 che mi riceva i dati provenienti da un PIC18F452 sulla seriale. Ho trovato qualche esempio, e sostanzialmente ho trovato due metodi:
1°Metodo
Public Sub LeggeCOM1()
Dim InString As Variant
Dim dato As String
' Recupera tutti i dati disponibili.
Form1.MSComm1.InputMode = comInputModeBinary
Form1.MSComm1.InputLen = 0
' Controlla la presenza di dati.
If Form1.MSComm1.InBufferCount Then
' Legge i dati.
n = Form1.MSComm1.InBufferCount
InString = Form1.MSComm1.Input
For i = 0 To n - 1
dato = InString(i)
Form1.List1.AddItem dato
Next i
End If
End Sub
2°Metodo
Dim RxBuffer$
Private Sub MSComm1_OnComm()
Dim Pos As Integer
Dim Rx$
Dim Pacchetto$
' Estraggo i dati arrivati
Rx$ = MSComm1.Input
If Len(Rx$) = 0 Then Exit Sub
' Accodo i dati arrivati al buffer
RxBuffer$ = RxBuffer$ & Rx$
' Mi assicuro di avere il buffer allineato ai pacchetti
If Left$(RxBuffer$, 1) <> "(" Then
' Scarto tutto ciò che sta prima del primo carattere di START
' Questo capita quando si ricevono dei caratteri dovuti a disturbi sulla
' linea seriale, tutt'altro che rari! es: "˙s2˙˙(12.7"
' oppure quando ho aperto la seriale (ed iniziato a bufferizzare i dati)
' a metà di un pacchetto dati in ricezione. es: "2.76)(13.16)"
Pos = InStr(RxBuffer$, "(")
RxBuffer$ = Mid$(RxBuffer$, Pos)
If Len(RxBuffer$) = 0 Then
' se il buffer è vuoto, tanto vale uscire
Exit Sub
End If
End If
' A questo punto controllo se sono arrivati dei pacchetti
' completi, li estraggo (tutti) e li elaboro
Do
Pos = InStr(RxBuffer$, ")")
If Pos = 0 Then Exit Do ' nessun'altro pacchetto completo, esco dal loop
' Estraggo il pacchetto, togliendo i caratteri di START e di STOP
Pacchetto$ = Mid$(RxBuffer$, 2, Pos - 2)
' Elimino il pacchetto dal buffer
RxBuffer$ = Mid$(RxBuffer$, Pos + 1)
' a questo punto se il buffer conteneva "(12.76)(13.16)",
' Pacchetto$="12.76" e RxBuffer$="(13,16)"
' Controllo se ci sono altri caratteri di START nel pacchetto.
' Infatti potrebbe capitare che un disturbo simuli un carattere
' di START ritrovando nel buffer qualcosa del tipo "(˙(12.75)"
' oppure un disturbo potrebbe aver eliminato un carattere di STOP,
' e quindi ritrovarci quancosa del tipo "(12.75˙(13.16) dove la "˙"
' sarebbe dovuta essere un ")" (in questo caso il primo pacchetto è perso)
Pos = InStr(Pacchetto$, "(")
If Pos Then
' esempio pacchetto contiene "12.75˙(13.16"
Pacchetto$ = Mid$(Pacchetto$, Pos + 1)
' ora Pacchetto$="13.16"
End If
' Il lavoro dello strato ISO/OSI di linea è compiuto,
' passo il pacchetto ricevuto al prossimo strato, che si preoccuperà di
' interpretare il significato dei dati ricevuti
Call ElaboraPacchetto(Pacchetto$)
Loop
End Sub
A questo punto che differenze ci sono nei due metodi di ricezione del pacchetto? Quale mi conviene usare?
1°Metodo
Public Sub LeggeCOM1()
Dim InString As Variant
Dim dato As String
' Recupera tutti i dati disponibili.
Form1.MSComm1.InputMode = comInputModeBinary
Form1.MSComm1.InputLen = 0
' Controlla la presenza di dati.
If Form1.MSComm1.InBufferCount Then
' Legge i dati.
n = Form1.MSComm1.InBufferCount
InString = Form1.MSComm1.Input
For i = 0 To n - 1
dato = InString(i)
Form1.List1.AddItem dato
Next i
End If
End Sub
2°Metodo
Dim RxBuffer$
Private Sub MSComm1_OnComm()
Dim Pos As Integer
Dim Rx$
Dim Pacchetto$
' Estraggo i dati arrivati
Rx$ = MSComm1.Input
If Len(Rx$) = 0 Then Exit Sub
' Accodo i dati arrivati al buffer
RxBuffer$ = RxBuffer$ & Rx$
' Mi assicuro di avere il buffer allineato ai pacchetti
If Left$(RxBuffer$, 1) <> "(" Then
' Scarto tutto ciò che sta prima del primo carattere di START
' Questo capita quando si ricevono dei caratteri dovuti a disturbi sulla
' linea seriale, tutt'altro che rari! es: "˙s2˙˙(12.7"
' oppure quando ho aperto la seriale (ed iniziato a bufferizzare i dati)
' a metà di un pacchetto dati in ricezione. es: "2.76)(13.16)"
Pos = InStr(RxBuffer$, "(")
RxBuffer$ = Mid$(RxBuffer$, Pos)
If Len(RxBuffer$) = 0 Then
' se il buffer è vuoto, tanto vale uscire
Exit Sub
End If
End If
' A questo punto controllo se sono arrivati dei pacchetti
' completi, li estraggo (tutti) e li elaboro
Do
Pos = InStr(RxBuffer$, ")")
If Pos = 0 Then Exit Do ' nessun'altro pacchetto completo, esco dal loop
' Estraggo il pacchetto, togliendo i caratteri di START e di STOP
Pacchetto$ = Mid$(RxBuffer$, 2, Pos - 2)
' Elimino il pacchetto dal buffer
RxBuffer$ = Mid$(RxBuffer$, Pos + 1)
' a questo punto se il buffer conteneva "(12.76)(13.16)",
' Pacchetto$="12.76" e RxBuffer$="(13,16)"
' Controllo se ci sono altri caratteri di START nel pacchetto.
' Infatti potrebbe capitare che un disturbo simuli un carattere
' di START ritrovando nel buffer qualcosa del tipo "(˙(12.75)"
' oppure un disturbo potrebbe aver eliminato un carattere di STOP,
' e quindi ritrovarci quancosa del tipo "(12.75˙(13.16) dove la "˙"
' sarebbe dovuta essere un ")" (in questo caso il primo pacchetto è perso)
Pos = InStr(Pacchetto$, "(")
If Pos Then
' esempio pacchetto contiene "12.75˙(13.16"
Pacchetto$ = Mid$(Pacchetto$, Pos + 1)
' ora Pacchetto$="13.16"
End If
' Il lavoro dello strato ISO/OSI di linea è compiuto,
' passo il pacchetto ricevuto al prossimo strato, che si preoccuperà di
' interpretare il significato dei dati ricevuti
Call ElaboraPacchetto(Pacchetto$)
Loop
End Sub
A questo punto che differenze ci sono nei due metodi di ricezione del pacchetto? Quale mi conviene usare?