Sto usando il seguente codice per leggere i valori da una porta COM:Come leggere la comunicazione porta seriale nel buffer e analizzare i messaggi completi
Private port As New SerialPort("COM13", 9600, Parity.None, 8, StopBits.One)
Private Sub port_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs)
Debug.Print(port.ReadExisting())
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
AddHandler port.DataReceived, New SerialDataReceivedEventHandler(AddressOf port_DataReceived)
port.Open()
End Sub
Questo funziona bene, ma ogni tanto non ottiene tutti i dati e in cambio risulta in due stringhe invece di una sola.
Un esempio potrebbe essere se la porta COM stava mandando sopra la parola "HELLO2YOU" era simile a:
HEL
LO2YOU
o
HELLO2
YOU
come posso mettere un buffer in là in modo che si assicura che abbia tutti i dati letti prima di visualizzarli?
Grazie!
Hans è corretto che ReadLine() è un modo semplice per ottenere i messaggi completi terminati da un valore "newline". Tuttavia, eviterei di utilizzare ReadLine poiché è normalmente implementato come una funzione di blocco e peggiorerà le prestazioni della GUI e altre attività. Normalmente memorizzerei i caratteri in un array fino a quando non avessi ricevuto il carattere di terminazione, quindi chiamerei il parser del comando. – Jeff
No, non quando lo si chiama nel gestore di eventi DataReceived, viene eseguito su un thread del threadpool. –