STMCU小助手
发布时间:2021-7-19 14:17
|
01、缓冲区 缓冲区看名字就知道,是缓冲数据用的。实现缓冲区最简单的办法时,定义多个数组,接收一包数据到数组A,就把接收数据的地址换成数组B,每个数据有个标记字节用于表示这个数组是否收到数据,收到数据是否处理完成。 上述方案是完全可行的,但有缺点: ①缓冲数据组数一定,且有多变量,代码结构不太清晰。 ②接收数据长度可能大于数组大小,也可能小于数组大小。不灵活,需要接收数据很长时容易出错,且内存利用率低。 解决这个问题的好办法是:环形缓冲区。 环形缓冲区就是一个带“头指针”和“尾指针”的数组。“头指针”指向环形缓冲区中可读的数据,“尾指针”指向环形缓冲区中可写的缓冲空间。通过移动“头指针”和“尾指针”就可以实现缓冲区的数据读取和写入。在通常情况下,应用程序读取环形缓冲区的数据仅仅会影响“头指针”,而串口接收数据仅仅会影响“尾指针”。当串口接收到新的数组,则将数组保存到环形缓冲区中,同时将“尾指针”加1,以保存下一个数据;应用程序在读取数据时,“头指针”加1,以读取下一个数据。当“尾指针”超过数组大小,则“尾指针”重新指向数组的首元素,从而形成“环形缓冲区”!,有效数据区域在“头指针”和“尾指针”之间。如下图
如上面说的,环形缓冲区其实就是一个数组,将其“剪开”,然后“拉直”后如下图
环形缓冲区的特性 1、先进新出。 2、当缓冲区被使用完,且又有新的数据需要存储时,丢掉历史最久的数据,保存最新数据。 02、代码实现 环形缓冲区的实现很简单,只需要简单的几个接口即可。 首先需要创建一个环形缓冲区
环形缓冲区的初始化
环形缓冲区的写入
环形缓冲区的读取
02、验证 光说不练假把式,下面我们就来验证上面的代码可行性。 串口中断函数中缓冲数据
结果显示没有出现丢包问题。如果你的应用场景串口通信速率快,数据量大或处理速度慢导致丢包,建议增大RINGBUFF_LEN的宏定义,增大缓冲区间即可。 Keil和IAR的工程文件下载地址: [url=https://github.com/strongercjd/STM32F207VCT6]https://github.com/strongercjd/STM32F207VCT6 [/url] |
学习STM32单片机,绕不开的串口
STM32串口通信基本原理
【STM32U3评测】实现双通道串口通信系统
OpenBLT移植到STM32F405开发板
OpenBLT移植到STM32F103战舰开发板上适用于所有STM32F103系列的Bootloader
【NUCLEO-WB09KE评测】STM32WB09KE的内部BootLoader使用
11111111111111111111111111111111111
STM32芯片ISP串口程序一键下载—FlyMcu
如何使用CubeMX实现STM32的串口通信以及对printf等函数的重定向
基于STM32串口中断之缓存区溢出卡死经验分享
微信公众号
手机版