普通储存数据
接收数据 先要有个 缓存区 通常先建立一个数组 来保存数据
缓存区内存 如何分配和释放
此时 一包数据为 5字节 缓冲区为 17字节
方法一:每次清空缓冲区,重头开始存放数据
第一次 存放在 字节1-5 然后分析读取这次数据 后 先清除BUF 然后 第二次存放 继续存字节1-5
这种方法 6-17字节 就没有用上, 好处:寻找数据包 及解析数据会比较方便
假设 一直判断 帧尾 有没有接收到 如果在字节5接收到帧尾 那么马上就能判断 字节1 为帧头,如果是帧头 就能去顺着解析数据。
缺点:会造成内存利用率越来越低 会有很多的内存碎片
方法二:建立环形缓冲区,内存管理更高效
假设 第一次接收5个字节大小的数据包 先存在缓冲区的 1-5 字节 第二次又5个字节大小的数据包 存在缓冲区的 6-10字节 就不是每次清空缓存区再存放数据了
第三包 11-15 第四包 第四包的第一个字节 存放在BUF的字节16 然后依次去存放 存放到字节17之后 就开始环回到字节1 存放剩下的数据
环形数组如何解析
首先 地址偏移量 由上图可知此时的Rev_p 为 当前数组元素 当接收完最后 一个数组元素后 判断是不是0x5c
判断完帧尾 如何 寻找 帧头
第一种情况 存放在1-4字节 此时 rev_p = 4 (4+17-4)%17=0
第二种情况 存放在 16-3字节 rev_p=3(帧尾在第三字节) (3+17-4)=16 16%17=16 所以 找到帧头就是在16个字节