缓冲区顾名思义是缓冲数据用的。实现缓冲区最简单的办法时,定义多个数组,接收一包数据到数组A,就把接收数据的地址换成数组B,每个数据有个标记字节用于表示这个数组是否收到数据,收到数据是否处理完成。
缺点:
①缓冲数据组数一定,且有多变量,代码结构不太清晰。
②接收数据长度可能大于数组大小,也可能小于数组大小。不灵活,需要接收数据很长时容易出错,且内存利用率低。
解决这个问题的好办法是:环形缓冲区。
环形缓冲区简介
环形缓冲区就是一个带“头指针”和“尾指针”的数组。在单片机中串口通信是我们使用最频繁的,使用串口通信就会用到串口的数据接收与发送,环形缓冲区方式接收数据可以更好的保证数据丢帧率第。
在通信程序中,经常使用环形缓冲器作为数据结构来存放通信中发送和接收的数据。环形缓冲区是一个先进先出的循环缓冲区,可以向通信程序提供对缓冲区的互斥访问。
环形缓冲区的一个有用特性是:当一个数据元素被用掉后,其余数据元素不需要移动其存储位置。相反,一个非圆形缓冲区(例如一个普通的队列)在用掉一个数据元素后,其余数据元素需要向前搬移。换句话说,环形缓冲区适合实现先进先出缓冲区,而非环形缓冲区适合后进先出缓冲区。
整合自:博客园、CSDN
编辑:jq
-
STM32
+关注
关注
2274文章
10931浏览量
358167
发布评论请先 登录
相关推荐
AMD Zen 4处理器悄然禁用循环缓冲区
ESP8266是否可以添加AT命令并使接收缓冲区大小可调?
ESP8266有双缓冲区吗?
创建DMA通道时,能否将DMA缓冲区的大小指定为8字节,并将DMA缓冲区的编号指定为1?
stm32野火开发板上做USB通信,PC端USB的缓冲区和串口缓冲区的大小是多少?
交换机与路由器缓冲区:寻找完美大小

评论