搜索
bottom↓
回复: 37

串口接收的环形队列

[复制链接]

出0入0汤圆

发表于 2011-5-28 10:01:42 | 显示全部楼层 |阅读模式
串口接收的环形队列,看到坛子里面有人说串口接收环形队列,可以解决内部ram不足,以很小的环形队列接收较多的数据
我可以不可以这样理解
定义一个数组,data[20];譬如接收满20个,就把这个20个处理了,然后清空在接收下面的,就是接收到data[19]就转向data[0]

是这个意思么,有没有实际运用啊,或者说有个 例子看看

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2011-5-28 19:47:58 | 显示全部楼层
看得多回的少,顶下

出0入0汤圆

发表于 2011-5-28 20:37:11 | 显示全部楼层
不知道你说的是不是这个,google 环形缓冲区

出0入0汤圆

发表于 2011-5-28 20:50:52 | 显示全部楼层
FIFO

出0入0汤圆

 楼主| 发表于 2011-6-4 07:42:54 | 显示全部楼层
回复【4楼】gujingji
-----------------------------------------------------------------------
谢谢,要的就是这个

出0入0汤圆

发表于 2011-6-8 20:59:00 | 显示全部楼层
环形缓冲,为了存储数据不至于在通讯太密集时造成数据丢失,一个缓冲区,数据依次从0往里面装,到结尾就清0,处理数据从0开始往外取,两个变量分别计数~~

出0入0汤圆

发表于 2011-6-8 22:02:23 | 显示全部楼层
回复【楼主位】Syth  
串口接收的环形队列,看到坛子里面有人说串口接收环形队列,可以解决内部ram不足,以很小的环形队列接收较多的数据
我可以不可以这样理解
定义一个数组,data[20];譬如接收满20个,就把这个20个处理了,然后清空在接收下面的,就是接收到data[19]就转向data[0]
是这个意思么,有没有实际运用啊,或者说有个 例子看看
-----------------------------------------------------------------------

是这个意思,其实这个,好处就在于,利用了队列的特点,两头,一头进,一头出,互不影响,在数据进去(往里存)的时候,另一边也可以把数据读出来,而读出来的数据,留下的空位,又可以增加多的存储空间。。
我写串口的时候,一直都是这么干的,挺好用的。

出0入0汤圆

发表于 2011-6-9 11:24:21 | 显示全部楼层
回复【8楼】380121850  六月
-----------------------------------------------------------------------

那不是硬件的FIFO就有的吗?

出0入0汤圆

发表于 2011-6-9 11:36:07 | 显示全部楼层
我对这个不是很理解,比如我现在要接受10K数据,而且这10K数据必须是完整的,一次性处理的,那怎么用较小的环形缓冲来接受??哪位大侠解释一下??

出0入264汤圆

发表于 2011-6-9 12:27:16 | 显示全部楼层
要想一次性处理10K,最少也得定义10K的缓冲区。

出0入0汤圆

发表于 2011-6-9 16:33:34 | 显示全部楼层
回复【11楼】mcu_lover
-----------------------------------------------------------------------
所以我觉得奇怪、、、这种环形列队接受方式,在什么样的情况下可以用?按照我的理解就是:比如我接受10K数据,但是我的列队缓冲只开辟了2K,那么应该就是这样:每次接收2K数据后,马上就要去处理一次数据,然后清空缓冲区,然后再去接收,直到5次接收完!但是对于我这样一次性要处理10K的数据,好像不适用啊。。是不是这样??

出0入0汤圆

发表于 2011-6-10 09:30:32 | 显示全部楼层
回复【12楼】myqiang1990 小松鼠
回复【11楼】mcu_lover  
-----------------------------------------------------------------------
所以我觉得奇怪、、、这种环形列队接受方式,在什么样的情况下可以用?按照我的理解就是:比如我接受10k数据,但是我的列队缓冲只开辟了2k,那么应该就是这样:每次接收2k数据后,马上就要去处理一次数据,然后清空缓冲区,然后再去接收,直到5次接收完!但是对于我这样一次性要处理10k的数据,好像不适用啊。。是不是这样??
-----------------------------------------------------------------------

如果这样的话就不符合环形缓冲的初衷了哈,环形缓冲是为了做到一边收数据一边处理在数据量密集的时候不至于丢掉数据或者数据产生冲突。如果你要接收的10K数据是一个最小单位,就是说处理的时候也要是10K一起处理,那么你的缓冲区至少也要开到10K,而且如果只开10K的话是体现不到环形缓冲的作用的;如果只是一次接收10K,但是处理却可以1K处理一次(举例),那么就可以在接收了1K的时候去处理数据,此时中断还在接收,数据仍然在一个一个往缓冲区里放,当接收到2K的时候,前面1K已经处理完成,这样缓冲区里就又有了可利用的1K空间,如此循环。开缓冲区最大的作用是为了防止丢码,在处理速度够快的时候可以节省RAM空间。

出0入0汤圆

 楼主| 发表于 2011-7-12 11:02:25 | 显示全部楼层
回复【13楼】yibunihao
-----------------------------------------------------------------------

谢谢赐教

出0入0汤圆

发表于 2011-7-20 17:01:47 | 显示全部楼层
环形队列
2个指针
一个管接收
一个管处理
只要有没有处理完的数据就处理
而接收就一个劲的接收,到尾了就从头存

出0入0汤圆

发表于 2011-7-20 17:53:31 | 显示全部楼层
回复【12楼】myqiang1990 小松鼠
回复【11楼】mcu_lover  
-----------------------------------------------------------------------
所以我觉得奇怪、、、这种环形列队接受方式,在什么样的情况下可以用?按照我的理解就是:比如我接受10k数据,但是我的列队缓冲只开辟了2k,那么应该就是这样:每次接收2k数据后,马上就要去处理一次数据,然后清空缓冲区,然后再去接收,直到5次接收完!但是对于我这样一次性要处理10k的数据,好像不适用啊。。是不是这样??
-----------------------------------------------------------------------

10K的数据,如果你单片机够快,实时查询缓冲区,你只要保证两次轮询时间在最大的情况下,FIFO不至于被写满即可。10K的话,32字节都能搞定。

出0入0汤圆

发表于 2011-7-20 21:28:52 | 显示全部楼层
是否可以理解为: 如果需要接收多条数据时(例如 GPS信息),选取其中最长一条数据的长短作为队列缓冲区的长度,其余小于这条信息长度的数据就可以公用这个缓冲区了对吗 原理有点像水杯与水壶的关系

出0入0汤圆

发表于 2011-7-20 21:40:35 | 显示全部楼层
mark

出110入109汤圆

发表于 2011-7-21 00:17:16 | 显示全部楼层
OS里“生产者-消费者”话题,用空间换时间~
装有CodeVision AVR的,可以看下系统生成的环形队列缓冲算法,记得马老师曾专题论过,称之为“串口中间件”。
16楼说得有点不对题,解决一个问题,“策略”自是多样的~

--------------------------------------------回复【17楼】liguole  
是否可以理解为: 如果需要接收多条数据时(例如 gps信息),选取其中最长一条数据的长短作为队列缓冲区的长度,其余小于这条信息长度的数据就可以公用这个缓冲区了对吗 原理有点像水杯与水壶的关系
-----------------------------------------------------------------------
“原理有点像水杯与水壶的关系”,这个比喻很形象!
“选取其中最长一条数据的长短作为队列缓冲区的长度”,>= max

出0入0汤圆

发表于 2011-10-29 09:52:59 | 显示全部楼层
不错。中断加环形队列。

出0入0汤圆

发表于 2012-1-4 16:35:06 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-6 09:42:36 | 显示全部楼层
学习了。

出0入0汤圆

发表于 2012-1-15 21:37:40 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-20 15:00:30 | 显示全部楼层
很有用的哦, 实际上我们每天都接触的键盘, 它的处理程序就是用循环队列的. 基本原理是:"有数据先给我先放着, 老子有空再处理.", 这里的老子是CPU.

出0入0汤圆

发表于 2012-2-15 16:04:42 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-3-26 18:31:46 | 显示全部楼层
不错 正需要这样处理

出0入0汤圆

发表于 2013-2-27 14:05:28 | 显示全部楼层
我也马上需要用到这个,正在研究中

出0入0汤圆

发表于 2013-2-27 18:37:39 | 显示全部楼层
这个不就相当于把8位的变了一下么……

出0入0汤圆

发表于 2013-2-27 18:45:19 | 显示全部楼层
不错,学习,学习

出0入0汤圆

发表于 2013-2-27 18:49:23 | 显示全部楼层
用  ringbuf

出20入25汤圆

发表于 2013-2-27 18:53:53 | 显示全部楼层
参考TI zigbee的Z-stack的DMA—USART 驱动,里面用到了环形队列,我已经移植到STM32,可用。

出0入0汤圆

发表于 2013-2-27 21:28:33 | 显示全部楼层
不错,好好学习,学习
头像被屏蔽

出0入0汤圆

发表于 2013-3-18 09:54:37 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2013-10-23 11:18:25 | 显示全部楼层
留名

出0入0汤圆

发表于 2014-7-23 12:06:28 | 显示全部楼层
myqiang1990 发表于 2011-6-9 16:33
回复【11楼】mcu_lover
-----------------------------------------------------------------------
所以 ...

假如波特率9600, 就是大概 960字节/秒, 10k数据需要10秒的时间传输. 这10秒都可以用来处理已接受的数据哦

出0入0汤圆

发表于 2015-10-9 09:15:20 | 显示全部楼层
环形缓冲队列 读指针 写指针各一个

出0入0汤圆

发表于 2017-12-6 14:40:57 | 显示全部楼层
就是环形FIFO嘛~~~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 23:52

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表