Tôi đang sử dụng đoạn mã sau để đọc các giá trị từ một cổng com:Làm thế nào để đọc cổng giao tiếp nối tiếp vào bộ đệm và phân tích ra thông điệp hoàn chỉnh
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
này hoạt động tốt, nhưng tất cả bây giờ và sau đó nó không có được tất cả dữ liệu và kết quả trả về trong hai chuỗi thay vì chỉ một.
Một ví dụ sẽ là nếu cổng com đã được gửi qua từ "HELLO2YOU" người ta trông giống như:
HEL
LO2YOU
hoặc
HELLO2
YOU
Làm thế nào tôi có thể đặt một bộ đệm trong đó để nó chắc chắn rằng nó có tất cả các dữ liệu đọc trước khi hiển thị nó?
Cảm ơn!
Hans đúng là ReadLine() là một cách dễ dàng để nhận được thông báo hoàn chỉnh được chấm dứt bằng giá trị "dòng mới". Tuy nhiên, tôi sẽ tránh sử dụng ReadLine vì nó thường được thực hiện như một chức năng chặn và sẽ làm suy giảm hiệu suất của GUI của bạn và các tác vụ khác. Thông thường tôi sẽ đệm các ký tự vào một mảng cho đến khi tôi nhận được ký tự kết thúc, sau đó gọi trình phân tích cú pháp lệnh. – Jeff
Không, không phải khi bạn gọi nó trong trình xử lý sự kiện DataReceived, nó chạy trên một thread threadpool. –