Używam następujący kod do odczytu wartości z portu COM:Jak czytać szeregowy port komunikacyjny do bufora i przetwarza się kompletne wiadomości
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
Działa to dobrze, ale co jakiś czas robi się wszystkie dane i wyniki zwracają dwa ciągi zamiast jednego.
Przykładem może być, jeśli port com wysyłał nad słowem „HELLO2YOU” było wyglądać następująco:
HEL
LO2YOU
lub
HELLO2
YOU
Jak mogę umieścić bufor tam tak, że upewnia się, że ma wszystkie dane odczytane przed wyświetleniem?
Dzięki!
Hans ma rację, że ReadLine() to łatwy sposób na uzyskanie kompletnych wiadomości zakończonych wartością "nowej linii". Unikałbym jednak korzystania z ReadLine, ponieważ jest ona zwykle implementowana jako funkcja blokująca i pogarsza wydajność interfejsu GUI i innych zadań. Normalnie buforowałbym znaki w tablicy, dopóki nie otrzymam znaku kończącego, a następnie wywołaję parser poleceń. – Jeff
Nie, nie, gdy wywołasz go w module obsługi zdarzeń DataReceived, działa on w wątku wątku. –