粘包问题处理
2021/6/8 18:23:02
本文主要是介绍粘包问题处理,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
粘包问题:
所谓粘包,就是指由于数据发送和接收不一致导致数据发送或接收出现偏离目标的现象。
如:发送数据: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,则表明数据流内容尚不够构成一个完整的数据结构(帧),需要留待与下一包数据合并后再进行处理。
这篇关于粘包问题处理的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-26Mybatis官方生成器资料详解与应用教程
- 2024-11-26Mybatis一级缓存资料详解与实战教程
- 2024-11-26Mybatis一级缓存资料详解:新手快速入门
- 2024-11-26SpringBoot3+JDK17搭建后端资料详尽教程
- 2024-11-26Springboot单体架构搭建资料:新手入门教程
- 2024-11-26Springboot单体架构搭建资料详解与实战教程
- 2024-11-26Springboot框架资料:新手入门教程
- 2024-11-26Springboot企业级开发资料入门教程
- 2024-11-26SpringBoot企业级开发资料详解与实战教程
- 2024-11-26Springboot微服务资料:新手入门全攻略