搜索
bottom↓
回复: 50

共享一个C语言环形缓冲区

  [复制链接]

出0入0汤圆

发表于 2014-11-13 11:40:51 | 显示全部楼层 |阅读模式
最近闲来无事,整理了这个小程序,主要实现了一个环形缓冲区,用来缓冲单片机串行通讯口数据的收发。
可以直接添加进自己的程序,具体使用说明包含在附件中。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-11-13 11:46:24 | 显示全部楼层
高手啊,缓冲区是多大的?波特率呢

出0入0汤圆

 楼主| 发表于 2014-11-13 12:22:37 | 显示全部楼层
磊磊映画 发表于 2014-11-13 11:46
高手啊,缓冲区是多大的?波特率呢

缓冲区大小在头文件中有个 NMAX 宏定义,可以根据需要修改。
这个是环形缓冲区,跟波特率没关系。

出0入0汤圆

发表于 2014-11-13 12:43:58 | 显示全部楼层
楼主能否介绍一下实现的原理?

出0入0汤圆

发表于 2014-11-13 12:48:24 | 显示全部楼层
一直都是直接读串口的,没有用过环形缓冲区,请问楼主这种环形缓冲区主要用在那些场合?谢谢楼主分享。

出0入0汤圆

发表于 2014-11-13 13:07:05 | 显示全部楼层
学习了,不过自己都是用的这个,比较简单,类似于先进先出型堆栈

ui16 ZLQn[4]={100,100,100,100};             //n为总数
static ui16 ZLQh[4]={0,0,0,0};              //栈尾
static ui16 ZLQt[4]={0,0,0,0};              //栈头
ui16 ZLQD[1][100];           //定义的数组深度为100

i16 ZLQnum(ui8 style)//计算当前堆栈实际所存储的数据总数
{
        return(ZLQn[style]+ZLQt[style]-ZLQh[style])%ZLQn[style];   //(总数+栈头-栈尾)%总数=当前堆栈存储数据总数
}
i16 ZLQinc(ui8 i,ui8 style)        //判断有无超过数组最大深度
{
        return (++i>=ZLQn[style])?0:i;
}

ui16 ZLQpush(ui16 c,i16 style)    //入栈
{       
        if (ZLQnum(style)>=ZLQn[style]) return 0;
            ZLQD[style][ZLQt[style]]=tmp;
        ZLQt[style]=ZLQinc(ZLQt[style],style);
        return c;
}

ui16 ZLQpop(ui16 style)           //出栈
{       
        ui16 c;
        if (ZLQnum(style)<0) return 99;
        c=ZLQD[style][ZLQh[style]];
        ZLQh[style]=ZLQinc(ZLQh[style],style);
        return c;
}
/*开启AD之前清空堆栈*/
void  ZLQpoplast(ui16 style)           //弹出堆栈内最后一个数据,相当于清空堆栈,将栈头等于栈尾
{       
        if (ZLQnum(style)==0) return ;   //如果当前堆栈内所存储的实际数据总数等于0,相当于栈内无数据
        ZLQh[style]=ZLQt[style]=0;       //
        return ;
}

出0入0汤圆

发表于 2014-11-13 14:06:57 | 显示全部楼层
LVmcu 发表于 2014-11-13 12:48
一直都是直接读串口的,没有用过环形缓冲区,请问楼主这种环形缓冲区主要用在那些场合?谢谢楼主分享。 ...

当你的系统来不及处理串口数据的时候

出0入0汤圆

发表于 2014-11-13 14:12:58 | 显示全部楼层
FIFO缓冲数据~~

出0入0汤圆

发表于 2014-11-13 14:16:31 | 显示全部楼层
我最近需要一个无锁的并发环形队列?
谁有好的资料?

出0入0汤圆

发表于 2014-11-13 14:19:47 | 显示全部楼层
多谢分享

出0入0汤圆

 楼主| 发表于 2014-11-13 19:57:57 | 显示全部楼层
LVmcu 发表于 2014-11-13 12:48
一直都是直接读串口的,没有用过环形缓冲区,请问楼主这种环形缓冲区主要用在那些场合?谢谢楼主分享。 ...

7楼正解

出0入0汤圆

 楼主| 发表于 2014-11-13 20:26:40 | 显示全部楼层
lichaoming520 发表于 2014-11-13 12:43
楼主能否介绍一下实现的原理?

WrIndex 写指针, RdIndex读指针,写指针指向下一个可写的位置,读指针指向可读的位置。每写入一个数据,写指针加1,当达到最大值的时候,再写一个数据又从0位置开始写,读指针与写指针变化类似,两个指针的差表示,缓冲区中的数据个数。来个图应该就明白了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-11-13 20:30:41 | 显示全部楼层
谢谢楼主分享!

出0入0汤圆

发表于 2014-11-13 20:31:22 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2014-11-13 20:41:02 | 显示全部楼层
很不错的, 对我挺有用的

出0入0汤圆

发表于 2014-11-14 07:40:46 来自手机 | 显示全部楼层
最近正在研究c实现的链表准备做CAN缓冲呢,mark, 有用

出0入0汤圆

发表于 2014-11-14 09:34:40 | 显示全部楼层
串口使用方式一直是用的楼主这方法在做

出0入0汤圆

发表于 2014-12-1 12:39:37 | 显示全部楼层
楼主好人

出0入0汤圆

发表于 2014-12-1 12:53:31 | 显示全部楼层
多谢楼主分析,学习一下

出0入8汤圆

发表于 2014-12-1 13:31:41 | 显示全部楼层
简单实用   好

出0入0汤圆

发表于 2014-12-1 13:45:52 | 显示全部楼层
kexinqiji 发表于 2014-11-13 20:26
WrIndex 写指针, RdIndex读指针,写指针指向下一个可写的位置,读指针指向可读的位置。每写入一个数据, ...

请问,你这个图是用什么软件绘制的
头像被屏蔽

出0入0汤圆

发表于 2014-12-1 13:58:36 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2014-12-1 14:36:01 | 显示全部楼层
本帖最后由 justSaar 于 2014-12-1 15:04 编辑

写了n个NMAX的数,却没来得及读, 那 FIFO_GetNum 得到的数就是错误的, 这时候程序处理是不是
就混乱了? 你程序 需要多做一些接收溢出保护

出0入0汤圆

发表于 2014-12-1 14:38:39 | 显示全部楼层
用环形的好处是不用担心溢出问题.之前试过几次因为溢出而死机

出0入0汤圆

发表于 2014-12-1 22:23:31 | 显示全部楼层
感谢楼主,又学习到了一点

出0入0汤圆

发表于 2014-12-3 18:24:05 | 显示全部楼层
kexinqiji 发表于 2014-11-13 20:26
WrIndex 写指针, RdIndex读指针,写指针指向下一个可写的位置,读指针指向可读的位置。每写入一个数据, ...

貌似ucosii的消息队列原理。

出0入0汤圆

发表于 2014-12-3 18:51:15 | 显示全部楼层
估计电工写程序拼不过码农啊,环形缓冲区对码农就是电工的电阻,很基础的。危机感来了。。。。

出0入4汤圆

发表于 2014-12-4 13:49:56 | 显示全部楼层
还不错了,简单实用,可以看看c++中的队列和列表的实现方法,接口更灵活一些

出0入4汤圆

发表于 2014-12-13 08:29:21 | 显示全部楼层
下载了,好好研究研究,最近可能用的着。

出0入0汤圆

发表于 2014-12-17 12:21:36 | 显示全部楼层
学习一下,谢谢楼主

出0入0汤圆

发表于 2014-12-17 12:52:32 | 显示全部楼层
下载学习。谢谢。

出0入0汤圆

发表于 2014-12-18 22:14:30 | 显示全部楼层
环行缓冲区之前用过,可将接收到的数据按顺序排序

出0入0汤圆

发表于 2014-12-19 08:36:13 | 显示全部楼层
学习一下.

出0入0汤圆

发表于 2014-12-19 08:48:58 | 显示全部楼层
下载研究一下.。

出0入0汤圆

发表于 2014-12-19 09:02:02 | 显示全部楼层
一直都是拿来主义,没有仔细研究过。改天好好看下……

出0入42汤圆

发表于 2014-12-19 09:09:41 | 显示全部楼层
谢谢分享!!!

出0入0汤圆

发表于 2014-12-21 09:37:16 来自手机 | 显示全部楼层
是fifo吧

出0入0汤圆

发表于 2014-12-21 10:06:57 来自手机 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2015-1-12 17:36:57 | 显示全部楼层
主程序何时处理接收到的数据?

出0入0汤圆

发表于 2015-1-12 17:47:02 | 显示全部楼层
果然是好东西啊.  松翰单片机,小家电控制器,移动电源,免费开发.

出0入0汤圆

发表于 2015-1-12 18:03:04 | 显示全部楼层
不错,学习一下

出0入0汤圆

发表于 2015-8-26 11:47:01 | 显示全部楼层
好东西,还是阿莫上的资源来的实用。

出0入0汤圆

发表于 2015-8-26 11:55:39 | 显示全部楼层
使用环形缓冲区有什么优势呢?用FIFO的话也可以的啊,本人小菜,望指点

出0入0汤圆

发表于 2016-5-19 14:53:43 | 显示全部楼层
参考一下,多谢楼主,不知道适不适合接受GPS模块数据

出0入42汤圆

发表于 2016-5-19 17:09:05 | 显示全部楼层
试试看还没有过呢 ,串口缓冲感觉不错啊

出0入0汤圆

发表于 2016-8-10 23:17:37 来自手机 | 显示全部楼层
就是循环对列,思路很好!

出0入0汤圆

发表于 2016-8-11 08:34:46 | 显示全部楼层
谢谢。 下载来看看那。

出0入0汤圆

发表于 2016-8-11 08:36:26 | 显示全部楼层
下载下来学习一下

出0入0汤圆

发表于 2016-8-22 19:46:30 | 显示全部楼层
谢谢分享,下载学习一下

出0入0汤圆

发表于 2016-8-22 21:15:04 | 显示全部楼层
感谢楼主,同时感谢挖坟者,程序确实简单易懂.

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-20 02:42

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

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