wince做为客户端,从硬件设备通过串口传输数据至客户端。硬件设备有一个开关设置,当设备处于打开状态时,会一秒钟发送一次指令数据至客户端,告知客户端此设备处于打开状态。当用户操作硬件设备时,又会发送另一种指令数据,且此指令会自动发送4遍。而且上述两种指令数据有时会分段发送,也就是说客户端接收的数据是一部分一部分的。我的程序偷了个懒。两种指令分别是9个字节和12个字节,这种方法不好。
我想获得第二种指令的完整数据,但是我写的程序有时接收不到数据。请问大
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { int n = serialPort1.BytesToRead; if (n == 0) { buf = new byte[n]; serialPort1.Read(buf, 0, n); return; } if (n == 9) { buf = new byte[n]; serialPort1.Read(buf, 0, n); return; } else if (n == 12) { buf = new byte[n]; serialPort1.Read(buf, 0, n); this.Invoke((EventHandler)delegate { this.tbxFirstEnergy.Text = (Convert.ToInt32(buf[7].ToString("X2").ToString() + buf[6].ToString("X2").ToString(), 16)).ToString(); System.Collections.BitArray ba = new System.Collections.BitArray(new byte[] { (byte)buf[8] }); if (ba[4]) { this.tbxFirstPosition.Text = "位置错误"; } else { this.tbxFirstPosition.Text = "除颤完成"; } if (ba[0]) { this.tbxFirstSynchro.Text = "同步"; } else { this.tbxFirstSynchro.Text = "异步"; } this.btnSearchFirst.Enabled = true; }); serialPort1.DataReceived -= serialPort1_DataReceived; this.serialPort1.Close(); // buf = null; } else { return; }
侠们这个问题如何解决呢?
根据协议来指定解决方案。一个函数的事情。不是接到数据就解析,而是你的传输数据必须是完备的具有辨识度的完整包。不然大罗神仙也没辙
虽然你的两种指令分别是9个字节和12个字节,但是serialPort1_DataReceived时不一定为9或12,有可能传输过程中部分数据传输太慢导致一条指令receive两次或者两条指令合并到一起了只receive一次,这是不确定的。
你可以每条指令以0x02开头以0x03结尾,中间是你的指令内容。数据接收时将数据合并到一个缓存中,并解析查找0x02和0x03如果符合特征将数据从缓存中删除,可能会解析出多条指令,当然可能性很小,也可能只有0x02没有0x03说明数据没接收完成,等待下一次接收时再与缓存合并并解析。
我的这两个指令时这样的0x080C1306360001FFFE和0x080C11091A0005001055FFFE,正如您说的有时一条指令分为好几次接收。您的意思是一接收数据就解析吗?我想要的是第二条指令,接收到了之后需要对其进行分析,后面接收的数据我就不需要了,您能不能再说的详细一些呢?
非常期待您的回答!!谢谢!!!
@答应不爱你: 当一条指令分好几次接收时将已接收到的部分指令放入一个缓冲区,等到指令接收完整之后再做处理。