粘包问题处理

粘包问题:
所谓粘包,就是指由于数据发送和接收不一致导致数据发送或接收出现偏离目标的现象。
如:发送数据:55 AA 01 00 02 00 03 F4 55 AA 01 00 02 00 03 F4
接收数据:55 AA
01 00
02 00 03 F4 55 AA
01 00 02 00
03 F4

这种现象,为了实现接收完整数据帧而采取的办法就是粘包处理。

1.定义一个缓冲区 byte[] buff;并读取数据 buff=serialPort.ReadToEnd()
2.判断buff是否等于指定长度 如:if(buff.Length()==8){
check(buff);//校验数据
}else if(buff.Length>8)
{
递归copy(buff,8);
}else if(buff.Length()<8)
{

循环读取接收缓冲区
}

分包算法:
基本思路是首先将待处理的接收数据流即系统缓冲区数据(长度设为M)强行转换成预定的结构的数据形式,
并从中取出结构数据长度字段L,而后根据包头计算得到第一包数据长度
M=系统缓冲区大小(SerialPort.ReadToEnd().Length())
L=用户发送的数据包=HeaderSize+BodySize=8

(1)若L<M,则表明数据流包含多包数据,从其头部开始截取若干个字节存入临时缓冲区,剩余部分数据依次继续处理,直至结束。

(2)若L=M,则表明数据流内容正好是一个完整的数据结构(帧,即用户自定义缓冲区等于系统缓冲区大小),直接将其存入临时缓冲区。

(3)若L>M,则表明数据流内容尚不够构成一个完整的数据结构(帧),需要留待与下一包数据合并后再进行处理。

原文地址:https://www.cnblogs.com/sundh1981/p/14863871.html