从串口实时接收数据 判断数据完整性 有代码

时间:2021-10-23 16:10:20
部分代码如下:
//实例化串口
private SerialPort Sp = new SerialPort();
//创建委托
public delegate void byte_update(byte[] byt);
//实例化
my_byte_updata = new byte_update(Updata_byteBox);

private void Updata_byteBox(byte[] byt)
{
   ???????
}

按钮点击事件下:
Sp.PortName = "COM3";
Sp.BaudRate = 9600;
Sp.Parity = Parity.None;
Sp.StopBits = StopBits.One;
Sp.DataReceived += new SerialDataReceivedEventHandler(Sp_DataReceived);
Sp.ReceivedBytesThreshold = 1;
Sp.Open();

private void Sp_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
byte[] readBuffer = new byte[Sp.ReadBufferSize];
Sp.Read(readBuffer, 0, readBuffer.Length);
this.Invoke(my_byte_update, readBuffer);
}
目前数据从串口接收,十六进制,数据开头为08 08,结尾是0c 0c。中间为我要的数据。我应该如何在“??”处判断数据是否接收完整,如何分开中间我要的数据。(数据例:08 08 08 88 00 00 00 00 00 00 00 01 00 00 00 00 00 01 00 00 04 17 00 00 00 00 00 00 00 00 0C 0C 以上为一组完整数据)不知道代码这样写合不合理 请各位前辈指正。

5 个解决方案

#1


根据设置的参数,这样有可能少接收,也可能多接受,视机器不同而不同,最好规定个协议,发多少,收多少,校验和等

#2


int len=Sp.Read(.......

你应该得到 readBuffer 中的有效字节数,然后把 readBuffer 中有效的数据写到一个在对象作用域(而不是方法内部)所初始化的 MemoryStream 中。

在Sp.Read的下一条语句,应该是检查 readBuffer 中有效数据的最后两位(假设有效位数>=2的话)是否是 0x0C,如果都是才去调用 my_byte_update。并且此时 readBuffer数组没有用,应该从那个 MemoryStream 中读取所有累计从串口读取到字节(而不是最后一次读取到的字节)。

并且,实际上也不应该使用 this.Invoke。应该推迟到必要时才调用它,只有接下来立刻就处理界面控件而不进行计算,这时候才调用 this.Invoke 代码。

#3


另外,实际上当调用 my_byte_update 之前一刻,应该重新初始化 MemoryStream,好用来累计以后的数据。



“如何分开中间我要的数据”?

你的代码其实也没有确认从两个 0x08 开始接收,而是随便给个什么数据就当作开始接收了。这个我就不管了。只说你的这个问题。从MemoryStream中ReadBytes得到的byte[]数据,用Array.Copy来取出从第3个字节到倒数第三个字节的数据就行了。


#4


串口接收时,需要等待一下,以同步。

#5


QQ 联系, 275774434

#1


根据设置的参数,这样有可能少接收,也可能多接受,视机器不同而不同,最好规定个协议,发多少,收多少,校验和等

#2


int len=Sp.Read(.......

你应该得到 readBuffer 中的有效字节数,然后把 readBuffer 中有效的数据写到一个在对象作用域(而不是方法内部)所初始化的 MemoryStream 中。

在Sp.Read的下一条语句,应该是检查 readBuffer 中有效数据的最后两位(假设有效位数>=2的话)是否是 0x0C,如果都是才去调用 my_byte_update。并且此时 readBuffer数组没有用,应该从那个 MemoryStream 中读取所有累计从串口读取到字节(而不是最后一次读取到的字节)。

并且,实际上也不应该使用 this.Invoke。应该推迟到必要时才调用它,只有接下来立刻就处理界面控件而不进行计算,这时候才调用 this.Invoke 代码。

#3


另外,实际上当调用 my_byte_update 之前一刻,应该重新初始化 MemoryStream,好用来累计以后的数据。



“如何分开中间我要的数据”?

你的代码其实也没有确认从两个 0x08 开始接收,而是随便给个什么数据就当作开始接收了。这个我就不管了。只说你的这个问题。从MemoryStream中ReadBytes得到的byte[]数据,用Array.Copy来取出从第3个字节到倒数第三个字节的数据就行了。


#4


串口接收时,需要等待一下,以同步。

#5


QQ 联系, 275774434