嵌入式硬件通信接口:使用RingBuffer处理数据(一)
前三节完整说明了UART的原理以及实现过程。
《嵌入式硬件通信接口协议-UART(一)协议基础》
《嵌入式硬件通信接口协议-UART(二)不同电气规范下的标准》
《嵌入式硬件通信接口协议-UART(三)快速使用串口及应用》
事实上UART只是一个传输层的协议。
在实际的项目使用中,往往是根据项目的具体需求,在以UART作为物理传输接口的通信方式上,自定义私有的应用层协议,这个应用层协议本质就是数据协议,并且对协议的解析和实现,都需要MCU对数据进行缓存、计算、校验、分析等操作。
说到缓存,在这先卖个关子……
估计大部分人首先想到的是,代码里定义个全局变量的缓存数组,然后从串口的接收寄存器读出数据,并逐个字节地写到缓存数组里,接完一包数据,执行数据分析……
这个想法是对的,逻辑是通的,但是……
多少字节是完整一包数据?
如果是中断接收,第一包收完还未来得及完全处理,有数据进来触发中断,又被写入缓存数组覆盖旧数据呢?
针对这问题,也许有人会想到,多定义几个缓存数组,数据包写满一个缓存数组则开始写到另一缓存数组,或者分析处理前先拷贝出来,再或者分析处理前关串口接收……
说来说去,这样子倒腾数据,一包一包的拷来移去的,太没效率了,还想关中断,这样通信效率也太低了!
针对这里的缓存问题,引入一个经典: 循环缓冲区Circular buffer。有很多叫法:圆形缓冲区(器)、圆形队列…
如此经典,在互联网上的资料也是相当多了,中文版的介绍推荐使用百度百科进行搜索“环形缓冲器”,英文版推荐使用维基百科进行搜索“Circular buffer”,在此不再赘述。
当你了解循环缓冲区之后,是不是早已磨刀霍霍地想马上敲代码?不着急,先到开源社区网站找一找,这里推荐GitHub。
好的开源项目,有人参与维护,还有人参与使用并给予反馈,使得项目代码更健壮。
到GitHub主页搜索“Circular buffer”找到相关项目,筛选C语言的项目:
从搜索结果中看到,按照相关程度排序方式下,被星标收藏的项目最多的是“TPCircularBuffer”,点进去后发现它用于音频处理
“A simple, fast circular buffer implementation for audio processing”
换个精简的来看吧。
返回搜索结果列表,点击第二个的“Ring-Buffer”,它的描述已经说明是用于嵌入式系统
“A simple ring buffer (circular buffer) designed for embedded systems.”
眼看embedded就亲切,就用这项目参考。
图片新闻
最新活动更多
-
即日-11.13立即报名>>> 【在线会议】多物理场仿真助跑新能源汽车
-
11月28日立即报名>>> 2024工程师系列—工业电子技术在线会议
-
11月29日立即预约>> 【上海线下】设计,易如反掌—Creo 11发布巡展
-
11月30日立即试用>> 【有奖试用】爱德克IDEC-九大王牌安全产品
-
12月19日立即报名>> 【线下会议】OFweek 2024(第九届)物联网产业大会
-
即日-12.26火热报名中>> OFweek2024中国智造CIO在线峰会
发表评论
请输入评论内容...
请输入评论/评论长度6~500个字
暂无评论
暂无评论