粘包问题处理
粘包问题:
所谓粘包,就是指由于数据发送和接收不一致导致数据发送或接收出现偏离目标的现象。
如:发送数据: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,则表明数据流内容尚不够构成一个完整的数据结构(帧),需要留待与下一包数据合并后再进行处理。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!