04-2-单片机模块化程序: 单片机接收数据之环形队列

资料源码:https://gitee.com/yang456/OpenProgrammingModuleForMCU.git

点击加入群聊【单片机,物联网,上位机】:ESP8266开发交流群

说明1:知识从未如此性感。 烂程序员关心的是代码,好程序员关心的是数据结构和它们之间的关系!

说明2:学的是思想,而非程序!此代码思路适用于所有的单片机。

说明3:学会以后,下面的代码可能会跟你一辈子!

说明4:这一系列文章是为大幅度裁剪本人博客文章!使博客文章更有条理。便于推其它教程!

 

1. 前言

在单片机通信项目中,经常会遇到接收大量数据并处理,但是单片机RAM不够用的问题.
列如:单片机循环接收不定长的数据(数据量很大,RAM不够用),我需要在数据接收的时候,计算所有数据的累加和.
注:有可能别人会想,我直接在中断里面累加就可以实现.


我只是说一个简单的需求,方便大家理解环形队列,
用户主要需要明白用环形队列可以解决什么问题!
 

2. 方案思考

单片机没有这么大内存供开发者使用,需要一边接收一边处理!
要是下面这样一个数组就好了
我不停的从数组首地址开始往里面存数据,然后又不停的从数组首地址开始取出里面的数据,
当存到了数组的尾地址,再存数据的时候,可以从头开始存
当取到了数组的尾地址以后,再取的时候,可以从头开始取

 

 

 

上面的整个圈是一个数组,红色箭头代表存数据,蓝色箭头代表取数据.
凡是蓝色箭头已经取出的地方,红色箭头可以再次往里面存.

有了上面的这样一个数组以后,接收的数据不停的存入数组,在处理数据的地方不停的取出,形成了一个循环!
这种模式有个名词:环形队列

提示:
实际上就是定义一个数组,然后用一些程序把数组的操作变为上面的形式!

 

3. 程序结构

LoopList: 把数组操作成环形队列的程序

 

 

 

 

4. 程序说明

1.定义数组,数组交给LoopList管理
定义的缓存数组只有20字节.

 

 

 

2.串口接收的数据交于LoopList存入数组

 

 

 

 

3.主循环不停的判断环形队列里面的数据个数
如果里面有数据,则取出来做累加

 

 

 

5. 测试

1.  发给串口2个数据

 

 

 

2.  发给串口50个数据

 

 

 

4.  发给串口500个数据

 

 

 

5.  发给串口3000个数据

 

 

 

6. 提醒

用户是否感受到了环形队列所能解决的问题??


串口在接收数据不停的插入缓存队列里面的时候,主循环不停的从里面取出数据处理.
这样就形成了一个环形结构,不停的存不停的取!


程序里面只用了20字节数组就接收处理了3000字节的数据.
正所谓:四两拨千斤


在使用的时候需要注意:
如果取数据的速度太慢,就会造成环形队列满.
用户根据实际情况调整缓存数组大小即可.

 

 

 

 

 

7. 结语

整个程序实际上就是把数据存入数组,然后从数组取出来数据处理!
只不过把数组交给了环形队列程序进行管理
存和取都是通过环形队列提供的函数进行操作
环形队列管理程序就是把数组形成了一个环.


环形队列用的最典型的地方:远程更新单片机程序
1.单片机程序一般都很大,单片机的RAM根本放不下
2.需要一边接收一边写入Flash里面,操作Flash会有延时


在不让程序文件分段下载的情况下,为了解决上面的问题,
环形队列是最好的选择.
我的所有的远程更新都是使用的环形队列实现.

 

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值