在 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
我在 VB.Net 中编写了一个应用程序,我想以最大波特率从串口读取接收到的数据。我在表单中使用了 SerialPort 组件,其属性如下:
(BuadRate=115200 , DataBits=8 , Parity=None , StopBits=One)
当我在DataReceived
事件中使用connPort.ReadLine
时,缓冲区中的数据拥塞导致我无法实时读取所有接收到的数据,因为事件触发比接收数据慢。
另一方面,当我使用connPort.ReadExisting
时,我可以实时读取所有接收到的数据而不会在缓冲区中出现数据拥塞,但是接收到的数据是这样的:
First received:
-12917
-12958
-13004Second received:
-13055
-13118
-13181
-1324Third received:
6
-13320
-13391
-13463
所以我需要逐行解析接收到的数据,另一方面我需要检测一些接收到的数据错误,如下所示:
...
-1324Third 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