在VB.Net中以最大波特率读取串行端口
我在VB.Net中编写了一个应用程序,希望以最大波特率从串行端口读取接收到的数据。我在表单中使用了SerialPort组件,其属性如下: (BuadRate=115200,数据位=8,奇偶校验=None,停止位=1) 当我在在VB.Net中以最大波特率读取串行端口,vb.net,serial-port,Vb.net,Serial Port,我在VB.Net中编写了一个应用程序,希望以最大波特率从串行端口读取接收到的数据。我在表单中使用了SerialPort组件,其属性如下: (BuadRate=115200,数据位=8,奇偶校验=None,停止位=1) 当我在DataReceived事件中使用connPort.ReadLine时,缓冲区中会导致数据阻塞,我无法实时读取所有接收到的数据,因为事件触发比接收到的数据慢 另一方面,当我使用connPort.ReadExisting时,我可以实时读取所有接收到的数据,缓冲区中没有数据拥塞,
DataReceived
事件中使用connPort.ReadLine
时,缓冲区中会导致数据阻塞,我无法实时读取所有接收到的数据,因为事件触发比接收到的数据慢
另一方面,当我使用connPort.ReadExisting
时,我可以实时读取所有接收到的数据,缓冲区中没有数据拥塞,但接收到的数据如下所示:
首次收到:-12917
-12958
-13004
第二次收到:
-13055
-13118
-13181
-1324
第三次收到:
6
-13320
-13391
-13463
因此,我需要逐行解析接收到的数据,另一方面,我需要检测一些接收到的数据错误,如下所示:
-1324
第三次收到:
6
...
正确的数据是:-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
我尝试了计时器组件和具有一毫秒间隔属性(一毫秒不是真正的分辨率)的勾选事件来接收数据,但触发速度也较慢,并且也存在提到的问题
我正在寻找一种正确的方法,并试图避免重复操作。谢谢你我的朋友们谢谢你的评论。我在Vb.Net中使用SerialPort组件时遇到了一个实时数据读取问题,最后我找到了一个解决方案,我想与大家分享 正如您所知,
DataReceived
事件不能保证为接收到的每个字节引发,我们必须使用BytesToRead
属性来确定缓冲区中还有多少数据需要读取。
我测试了一种新方法,While…End-While
结构几乎在100毫秒内迭代1000次。因此,它的触发速度比任何事件都快,因此我在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
我们能看一些代码吗
ReadLine()
应该可以工作。你设置了connPort.Newline吗?谢谢你的评论。我在问题中添加了我的代码。当我使用connPort.ReadLine()
时,我遇到了一些问题。起初我没有定义换行符属性,但我在初始化中定义了剩余的connPort.NewLine=Chr(13)。ToString
,但它不能解决我的问题,实际上我找不到任何区别。如果使用connPort.Read()
而不是connPort.ReadLine(),会发生什么
?@farzad89尝试vbCr
查看Newline
。如果执行connPort.Read()
,则应该能够识别换行符。任何通情达理的人都会将其设置为Chr(13)
(vbCr)或Chr(10)
(vbLf)。这是您的两个最佳选择。此外,我们可以使用connPort.ReadTo(vbCrLf)
而不是connPort.ReadLine
。