我在从串行端口读取数据时遇到问题,并且该数据来自arduino,它定期(每秒1或2次)发送它正在执行的操作的状态。使用Atmel工作室或Arduino IDE读取串口,一切正常,但我正在VB.net 2010中编写一个监控程序,然后事情开始变得很糟糕。
我打开我的端口(115200波特)并为“Datareceived”事件设置了一个事件处理程序,在这个例子中,我有一个stringbuilder,它附加了Serial.Readline的输出并用它更新了一个文本框。
现在问题就在于......它似乎只能看到4-6行(每个约20个字节),并且支持arduino端的处理..我玩过缓冲区大小,传输速度(下降)到9600没有帮助,它只是读取更少的线条,更高的传输速度(230400)没有改变任何东西。使用缓冲区长度,握手..你的名字。
以下是我每秒钟应该获得的一个例子
样本= 885时间= 885008 RPM.Value = 0.00 RPM.Slope = 0.00 TPS.Value = 5.05 TPS.Slope = 25.25 MAP.Value = 20.58 MAP.Slope = 6.02 EGP.Value = 20.58 EGP.Slope = 3.01 TSS.Value = 0.00 TSS.Slope = 0.00 BPS.Value = 171.18 POT = 25 AUX = 25 Base Position = 80 DPR comp = 0 TPS斜率补偿= 74辅助补偿= 75所有补偿= 149正常模式= 80 Overboost comp = 0限制位置= 229
(抱歉,换行似乎不想工作......但你明白了)
有趣的是,我没有错过任何数据,我得到的几行数据的频率我应该得到所有数据...... 不知何故,端口没有跟上,即使我的事件处理程序确实没有做很多事情。我已经尝试将原始串行数据转储到调试窗口,它没有改变任何东西......你会我认为如果这个功能问题太严格,我会根据我需要做多少来获得数据
目前正在研究一个新想法......在计时器刻度事件(250毫秒间隔)上解析变量/值,并将每个新行添加到队列中......它应该加快速度。
答案 0 :(得分:1)
尝试使用ReadExisting而不是使用阻塞ReadLine。您必须手动检测换行符并提取消息。
Private Sub SerPort_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerPort.DataReceived
Static sb As New System.Text.StringBuilder
sb.Append(SerPort.ReadExisting)
If sb.ToString.Contains(SerPort.NewLine) Then
'the stringbuilder contains at least one message
'that ends in a newline
End If
End Sub
还有其他(更好)的方法可以帮助您。