Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在VB.Net中以最大波特率读取串行端口_Vb.net_Serial Port - Fatal编程技术网

在VB.Net中以最大波特率读取串行端口

在VB.Net中以最大波特率读取串行端口,vb.net,serial-port,Vb.net,Serial Port,我在VB.Net中编写了一个应用程序,希望以最大波特率从串行端口读取接收到的数据。我在表单中使用了SerialPort组件,其属性如下: (BuadRate=115200,数据位=8,奇偶校验=None,停止位=1) 当我在DataReceived事件中使用connPort.ReadLine时,缓冲区中会导致数据阻塞,我无法实时读取所有接收到的数据,因为事件触发比接收到的数据慢 另一方面,当我使用connPort.ReadExisting时,我可以实时读取所有接收到的数据,缓冲区中没有数据拥塞,

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

(BuadRate=115200,数据位=8,奇偶校验=None,停止位=1)

当我在
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