转载连接: http://blog.csdn.net/htiannuo/article/details/51098973
总体借鉴博客园的,虽然知道模式,但是借鉴了别人的写法:点击打开链接
个人的意见与思路:
1.先获取足够的数据信息。
2.判断帧头,获取需要的数据信息
3.帧尾结束,执行下一次判断
4.移除处理过的数据
使 用缓存机制完成。首先通过定义一个成员变量List<byte> buffer = new List<byte> (4096);用来存放所有的数据,在接收函数里,通过buffer.AddRange()方法不断地将接收到的数据加入到buffer中,并同时对 buffer中的数据进行检验,如果达到一定的长度并且校验结果正确(校验方法在发送方和接收方一致),再进行处理。具体代码如下:代码
- private List<byte> buffer = new List<byte>(4096);
- private void sp_DataReceived(objectsender, EventArgs e) //sp是串口控件
- {
- int n = sp.BytesToRead;
- byte[] buf = new byte[n];
- sp.Read(buf, 0, n);
- //1.缓存数据
- buffer.AddRange(buf);
- //2.完整性判断
- while (buffer.Count >= 4) //至少包含帧头(2字节)、长度(1字节)、校验位(1字节);根据设计不同而不同
- {
- //2.1 查找数据头
- if (buffer[0] == 0x01) //传输数据有帧头,用于判断
- {
- int len = buffer[2];
- if (buffer.Count < len + 4) //数据区尚未接收完整
- {
- <span style="white-space:pre;"> </span>break;
- }
- //得到完整的数据,复制到ReceiveBytes中进行校验
- buffer.CopyTo(0, ReceiveBytes, 0, len + 4);
- byte valid; //开始校验
- <span style="font-family:Arial, Helvetica, sans-serif;">valid </span>= this.JY(ReceiveBytes);
- if (jiaoyan != ReceiveBytes[len+3]) //校验失败,最后一个字节是校验位
- {
- <span style="white-space:pre;"> </span>buffer.RemoveRange(0, len + 4);
- <span style="white-space:pre;"> </span>MessageBox.Show("数据包不正确!");
- <span style="white-space:pre;"> </span>continue;
- }
- buffer.RemoveRange(0, len + 4);
- /执行其他代码,对数据进行处理。
- }
- else //帧头不正确时,记得清除
- {
- buffer.RemoveAt(0);
- }
- }
- }