我在vb.net中创建了一个应用程序,它通过串口连续发送和接收数据。我形成一个框架,其中包含一些自定义参数,例如帧编号,帧长度,实际字符串。它们由特殊字符分隔,如'@','#','$'等。 例如@#3 $ 21%Hello.There !!&安培;
我必须在两个连续帧之间的最小1 ms间隙进行测试。 我面临的问题是,当我在循环测试中收到数据时,通常会丢失一些字符。它被视为一个损坏的帧,但我无法理解为什么它发生在Windows上的循环返回测试中。这个框架看起来像@#3 $ 21Hello。!!& 。 接收功能就是这样。
Private Sub DataReceivedHandler(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles RXCOMPort.DataReceived
If e.EventType = SerialData.Chars Then
If checkFlag = False Then
'---receive data
str &= RXCOMPort.ReadExisting()
checkFlag = True ' for the thread of processing received data
End If
End If
End Sub
稍后将会有一些基于微控制器的硬件,它将从UART接收数据并将数据发送到UART。
答案 0 :(得分:0)
If checkFlag = False Then
'---receive data
str &= RXCOMPort.ReadExisting()
checkFlag = True ' for the thread of processing received data
End If
如果在您的其他处理函数中设置checkFlag之前执行了Handler会发生什么?
例如,第一个处理程序回调收集 @#3 $ 21%Hello。
然后你去处理。如果在处理功能完成第一批数据之前执行处理程序会发生什么?是否会删除新的串口数据?
通常,您希望将接收的数据放入循环缓冲区。在接收处理程序中执行此操作,仅执行此操作。
在另一个函数或线程中,对循环缓冲区起作用。这样,处理程序的工作就是只将数据放入循环缓冲区,并且不会丢弃数据。