VB 中serialPort 数据读取和发送

PrivateSubSerialPort1_DataReceived(ByValsenderAsSystem.Object,ByValeAsSystem.IO.Ports... Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
If SerialPort1.ReadByte = 170 Then '如果读到的是头码,就继续接18个字符(一帧数据共19字节)
SerialPort1.Read(inbyte, 1, 18)
End If
Threading.Thread.Sleep(100) '延时100毫秒
'讲读取数据通过同步委托显示到文本框中给,并在其中将输出字节数组outbye()进行赋值
If bz = 1 Then '在同步委托显示中,判断如接到一帧完整数据,就将bz=1
SerialPort1.Write(outbyte, 0, 18)
bz = 0 '等待下一次触发
End If
End Sub

用此方法理论上应该是读取一帧数据,延时100毫秒发送数据,但实际 不是如此,第一次发送的间隔是100毫秒,但后面时序就乱了,因为我用的是485的半双工通信,发信息的时候都和读取信息的时候重叠了,在示波器上看到的。

不明白这是为什么?datarecievd可以这么用的吧
展开
 我来答
满以柳J7
推荐于2016-08-29 · TA获得超过539个赞
知道小有建树答主
回答量:545
采纳率:66%
帮助的人:552万
展开全部
我想说的是:
1、串口数据的发送与读取与计算机的状态有直接的关系。理论上我们可以用程序控制自己设计的数据块一个一地发送,并想一个一个地接收....实际上不是这样的。
2、我们写的软件系统在向计算机发送缓存区放置数据块并向windows发送数据发送指令后,计算机会根据自己的系统状态及串口的状态才决定是否直接发送数据及发送多少个数据块...
接收数据也是相同的原理,当计算机接收缓存区有数据字节到了,计算机便产生一个有数据接收的指令,这时程序才去读取缓存区的数据,以便程序进行处理。
3、你要理解这个运行原理后,才能组织自己的程序。
把要发送的数据块组织好,如果是19个自己可以一次行向串口发送
要利用 SerialPort 的 OnComm 事件处理接收的数据。当接收缓存区有数据到时,把数据先读取到临时变量,再对数据进行判断保存。

4、你说的出现乱的问题就是发送时间间隔调整不好的结果
因为你发送端在不断的发送,接收端总是处理不完所以在接收缓存区就有多个数据块,而且这些数据块也不完整,所以你看的就是乱的。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式