第31讲 循环缓冲区与命令解析

串口在持续接收数据时容易发生数据黏包(先接收的数据尚未被处理,后面的数据已经将内存覆盖)的情况,循环缓冲区的本质就是将串口接受到的数据马上拷贝到另外一块内存之中。为了避免新来的数据覆盖掉尚未处理的数据,一方面缓冲区的长度需要有一定的冗余,另外一方面需要引入写索引(写指针)始终指向未写数据区域的开头。

当一包数据发生溢出的时候,也可以被切割为两部分,一部分写在缓冲区最后,另外一部分写在缓冲区开头。

与此同时,为了防止写入buffer的新数据把尚未处理的旧数据覆盖掉,我们还需要引入读索引的机制,让其指向正在解析的数据的开头。CPU解析完成一帧数据之后再让readIndex指向下一帧需要解析的数据。

综上,当新数据到来之时,我们就需要判断writeIndex和readIndex之间的空闲区域是否能装下新的数据,如果装不下,就只能抛弃这一帧数据。出现这种情况后,我们就需要调整这三个参数:(增大)缓冲区大小、(减慢)发送方发送速度、(加快)数据处理速度。

循环缓冲区算法示意图:

相关推荐
正点原子21 分钟前
正点原子 x STM32:智能加速边缘AI应用开发!
人工智能·stm32·嵌入式硬件
田甲24 分钟前
【STM32】基于串口的bootloader
stm32·单片机·嵌入式硬件
杰尼君1 小时前
STM32CubeMX笔记(11)-- AD模块使用
笔记·stm32·嵌入式硬件
lingzhilab4 小时前
零知IDE——STM32F407VET6与ADS1115模数转换器实现多通道数据采集显示系统
stm32·单片机·开源
happygrilclh8 小时前
stm32L496 flash 分配
stm32·单片机·嵌入式硬件
古译汉书8 小时前
嵌入式铁头山羊STM32-各章节详细笔记-查阅传送门
数据结构·笔记·stm32·单片机·嵌入式硬件·个人开发
Heavy sea12 小时前
STM32定时器(寄存器与HAL库实现)
stm32·单片机
路过羊圈的狼14 小时前
STM32的HAL库驱动ADS124S08进行PT100温度采集
stm32·嵌入式硬件·mongodb
辛集电子15 小时前
【STM32】位带操作
stm32·单片机·嵌入式硬件
机器视觉知识推荐、就业指导16 小时前
STM32 外设驱动模块:声音传感器模块
stm32·单片机·嵌入式硬件