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

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

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

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

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

循环缓冲区算法示意图:

相关推荐
XiHongShi20164 天前
STM32F407 RTC定时器例程,建议保存
stm32·单片机·学习
优信电子4 天前
AIT1001 非接触式红外测温模块 STM32 驱动开发实战:从引脚到代码全解析
stm32·嵌入式·温度传感器·红外测温·非接触式测温·ait1001
深圳老胡4 天前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
wuyk5554 天前
《WiFi 嵌入式物联网开发全套实战》| 第 16 章 ESP32 AP+STA 双模共存原理与工程坑点
网络·stm32·物联网
Brilliantwxx4 天前
【STM32】 SPI Flash 驱动开发实战:阻塞模式驱动 W25Q64(含工程代码)
开发语言·stm32·单片机·嵌入式硬件
youcans_4 天前
【嵌入式软件AI编程】16. Claude Code 与 VS Code 的协同开发
stm32·mcu·嵌入式·ai编程·claude code
Zw-awa4 天前
按键接到 STM32 后:GPIO 输入到底读到了什么
stm32
MarkZhou6244 天前
智能蒸烤双核通信架构拆解:从冗余耦合到分层解耦
stm32·单片机·嵌入式硬件·架构·安卓·安全架构
chem41114 天前
STM32CubeMX Linux 开发环境搭建
stm32·单片机·linux系统
无敌贵点大王4 天前
RTThread学习记录11——RT-Thread 设备模型吃透:UART/ADC/PWM/PIN 到底有什么区别?
c语言·stm32·学习·链表