缓冲区顾名思义是缓冲数据用的。实现缓冲区最简单的办法时,定义多个数组,接收一包数据到数组A,就把接收数据的地址换成数组B,每个数据有个标记字节用于表示这个数组是否收到数据,收到数据是否处理完成。
缺点:
①缓冲数据组数一定,且有多变量,代码结构不太清晰。
②接收数据长度可能大于数组大小,也可能小于数组大小。不灵活,需要接收数据很长时容易出错,且内存利用率低。
解决这个问题的好办法是:环形缓冲区。
环形缓冲区简介
环形缓冲区就是一个带“头指针”和“尾指针”的数组。在单片机中串口通信是我们使用最频繁的,使用串口通信就会用到串口的数据接收与发送,环形缓冲区方式接收数据可以更好的保证数据丢帧率第。
在通信程序中,经常使用环形缓冲器作为数据结构来存放通信中发送和接收的数据。环形缓冲区是一个先进先出的循环缓冲区,可以向通信程序提供对缓冲区的互斥访问。
环形缓冲区的一个有用特性是:当一个数据元素被用掉后,其余数据元素不需要移动其存储位置。相反,一个非圆形缓冲区(例如一个普通的队列)在用掉一个数据元素后,其余数据元素需要向前搬移。换句话说,环形缓冲区适合实现先进先出缓冲区,而非环形缓冲区适合后进先出缓冲区。
整合自:博客园、CSDN
编辑:jq
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
STM32
+关注
关注
2313文章
11205浏览量
375144
发布评论请先 登录
相关推荐
热点推荐
DMA传输完成通知未在S32K324上的半满缓冲区时触发,为什么?
S32K344发生第一次中断时(半缓冲区已满并发生中断):
第一次中断发生时S32K324:
我使用以下代码片段来配置 DMA 传输:
K344 上的 TCD:
TCD 对S32K324:
发表于 04-02 08:10
C语言的缓冲区(缓存)详解
缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。
发表于 01-14 07:30
嵌入式常用算法,环形缓冲
期望帧逻辑优化
修改匹配期望帧任务的条件
增加匹配期望帧函数
1.0.0.1 优化耦合性
优化读取逻辑
增加多缓冲区支持
1.0.0.0 主体架构搭建,完成读写环形结构化
发表于 12-01 08:16
CW32L052串口的缓冲区机制
默认缓冲区配置
CW32L052的UART模块支持硬件FIFO(通常为16字节),但HAL库或用户代码需手动管理接收缓冲区。若未显式分配足够大的软件缓冲区,可能导致
发表于 11-24 06:40
飞凌嵌入式ElfBoard-标准IO接口之设置缓冲区
;\\n\"时,标准I/O才会执行对应的系统I/O操作。对于输出流,在输出一个换行符前将数据缓存(除非缓冲区已经被填满),当输出换行符时,再将这一行数据通过系统I/O(write函数)刷入到内核
发表于 11-14 09:02
【道生物联TKB-623评估板试用】+3、模块深度测评:高频率数据传输的缓冲区陷阱与优化方案
模块深度测评:高频率数据传输的缓冲区陷阱与优化方案
本文记录了在实际项目中使用620 LoRa模块时遇到的一个隐蔽却关键的问题,以及完整的排查和解决方案。
问题现象:高频率发送数据时的异常行为
发表于 10-15 19:29
移植的lvgl,在运行的时候,缓冲区无法释放怎么解决?
代码在运行的时候,只有lvgl线程用于刷新,另一个线程只有一个串口打印。
当运行一段时间后,发现,程序会在LVGl中,lv_refr.c这个库下面第625行代码,
在这一直判断,看介绍说是在等待释放缓冲区,求大神给个思路
发表于 09-09 07:28
如何检测USB设备IN端点缓冲区内是否存在待传输的数据?
我需要调用 USBDevice->BulkInEndPt->XferData 来获取 USB IN 缓冲区的数据大小(按字节),但这样做会导致数据被传递到主机。目前,我
发表于 07-28 06:52
USB如何判断IN缓冲区有值?
调用 USBDevice->BulkInEndPt->XferData 可获取 USB IN 缓冲区的数据大小(按字节),但数据会被传至主机。目前,我先要判断 USB
发表于 07-23 08:21
对于CYUSB3014芯片,哪个函数可以读取GPIF II端DMA缓冲区中缓存的实际数据量?
:
1.哪个函数可以读取USB端口缓冲区数据的实际字节数?
2. 哪个函数可以读取 GPIF II 上 DMA 缓冲区数据的实际字节数?
3、GPIF II 接口的标志信号会受 USB
发表于 07-21 07:27
如何清除CYUSB3014的缓冲区数据?USB接口数据什么时候发送到电脑?
、如何清除GPIF II接口处对应的DMA BUFFER数据?当标志设置为满/非满状态时,一旦 DMA 缓冲区已满,标志信号就会指示它已满。清除DMA缓冲区数据后,相应的标志信号会改变
发表于 07-18 07:58
请问USB缓冲区取数据可以多次取吗?
在使用USB软件获取数据是,下位机给我发送了13个32位数据到USB IN缓冲区,为什么我调用API函数想要第一次取1个32位数据,取完之后再取12位
发表于 07-16 08:12
socket缓冲区溢出的原因?怎么解决?
我在测试视频通话时 发现丢帧特别严重 进行了一些列的排查 发现socket本身似乎有问题
通过测试代码发现了大量的缓冲区溢出我尝试换了不同的服务器
我还分别测试了wifi网卡和4G网卡 全都这样
发表于 06-19 06:34
【RA4L1-SENSOR】串口收发 + 环形缓冲区
)%MAX_BUFFER_LEN;//防止尾部越界
uart_queue.len++;//环形缓冲区中数据长度
return QUEUE_SUCCESS;
}
static QUEUE queue_read(uint8_t
发表于 06-11 10:24
缓冲区是啥意思 STM32串口数据接收之环形缓冲区
评论