在 VB.Net 中以最大波特率读取 SerialPort

Read SerialPort in Maximum BaudRate in VB.Net

我在 VB.Net 中编写了一个应用程序,我想以最大波特率从串口读取接收到的数据。我在表单中使用了 SerialPort 组件,其属性如下:

(BuadRate=115200 , DataBits=8 , Parity=None , StopBits=One)

当我在DataReceived事件中使用connPort.ReadLine时,缓冲区中的数据拥塞导致我无法实时读取所有接收到的数据,因为事件触发比接收数据慢。

另一方面,当我使用connPort.ReadExisting时,我可以实时读取所有接收到的数据而不会在缓冲区中出现数据拥塞,但是接收到的数据是这样的:

First received:
-12917
-12958
-13004

Second received:
-13055
-13118
-13181
-1324

Third received:
6
-13320
-13391
-13463

所以我需要逐行解析接收到的数据,另一方面我需要检测一些接收到的数据错误,如下所示:

...
-1324

Third received:
6
...

The correct data is: -13246

我的代码:

Private Sub connPort_DataReceived _
    (ByVal sender As System.Object, _
     ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _
                                 Handles connPort.DataReceived
    Dim rcData as String
    rcData = connPort.ReadLine
    dt_Write(rcData)

    'rcData = connPort.ReadExisting
    'dt_Write(rcData)
End Sub

' Save received data in a created DataTable
Public dt As New DataTable
Private Sub dt_Write(ByVal rcData As String)
    dt.Rows.Add(New Object() {Nothing, rcData})
End Sub

我试过定时器组件和Tick事件以一毫秒的间隔属性(一毫秒不是真正的分辨率)来接收数据,但发射速度也较慢,也有提到的问题。

我正在寻找一个正确的方法,我正在努力避免多余的操作。谢谢

我的朋友们感谢您的评论。我在 Vb.Net 中使用 SerialPort 组件时遇到实时数据读取问题,最后我找到了解决方案并想与您分享。

如您所知,DataReceived 事件并不能保证为接收到的每个字节都引发,我们必须使用 BytesToRead 属性 来确定还剩下多少数据在缓冲区中读取。 https://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived(v=vs.110).aspx

我测试了一种新方法,While...End While结构在100毫秒内几乎迭代了一千次。所以它的触发速度比任何事件都快,所以我在 DataReceived 事件中使用了这个结构,直到 BytesToRead 大于零。通过这种策略,我能够实时读取接收到的数据。

我的代码是:

Private Sub connPort_DataReceived _
(ByVal sender As System.Object, _
 ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _
                             Handles connPort.DataReceived
    Dim rcData as String

    While connPort.BytesToRead > 0
        rcData = connPort.ReadLine
        dt_Write(rcData)
    End While

End Sub

' Save received data in a created DataTable
Public dt As New DataTable
Private Sub dt_Write(ByVal rcData As String)
    dt.Rows.Add(New Object() {Nothing, rcData})
End Sub