zoukankan      html  css  js  c++  java
  • 粘包问题处理

    粘包问题:
    所谓粘包,就是指由于数据发送和接收不一致导致数据发送或接收出现偏离目标的现象。
    如:发送数据: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,则表明数据流内容尚不够构成一个完整的数据结构(帧),需要留待与下一包数据合并后再进行处理。

  • 相关阅读:
    14. D3D光照
    17. 增加对硬件光照的支持
    ECommerce Starter Kit 数据库表和存储过程一览
    使用 DataAdapter 执行批量更新
    学习Professional ASP.NET 2.0(四)
    c#泛型学习(二)
    学习Professional ASP.NET 2.0(一)
    学习Professional ASP.NET 2.0(二)
    下载:微软网页设计工具CTP测试版(支持asp.net2.0)
    学习ECommerce Starter Kit (1)
  • 原文地址:https://www.cnblogs.com/sundh1981/p/14863871.html
Copyright © 2011-2022 走看看