搜索
bottom↓
回复: 5

马老师书中usart接收数据缓冲队列中一个指针的疑惑

[复制链接]

出0入0汤圆

发表于 2009-9-20 11:34:08 | 显示全部楼层 |阅读模式
在接收中断中有一句

if(++rx_counter == RX_BUFFER_SIZE)    //队列中受到的字符加1,并判断是否队列已满,

{
      rx_counter = 0;      //队列满了

我对这句不解,这个变量是用来计算队列收到的字符个数,如果是按这样的条件判断的话,接收到7个字符就判断接收队列已满,而RX_BUFFER_SIZE = 8,

麻烦马老师或看过书的童鞋解答下,谢谢了

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

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2009-9-20 11:48:40 | 显示全部楼层
0-7不就是 8吗?

出0入0汤圆

发表于 2009-9-20 12:51:44 | 显示全部楼层
C语言的数组(BUFFER)是从0开始的。这是最基本的东西了。

出0入0汤圆

 楼主| 发表于 2009-9-20 21:33:55 | 显示全部楼层
艾,真是不好意思,队列数组用到三个指针,前两个我都理解是0到7算起的,就糊涂地把这个指针从1算起了。

我回去继续消化您的书,避免以后问这种RZ问题。

另外我把队列缓冲用到i2c接口程序上,中断加队列缓冲,底层加中层,效果不错。

出0入0汤圆

发表于 2012-3-26 22:16:11 | 显示全部楼层
对书上注释部分还有一些疑问。
每接收一个数据后,rx_counter加一。那么,接收第八个数据后,rx_counter才加到8,最后一个数据应该没有覆盖到最前面数据才对。
还有,getchar()当中,while(rx_counter==0)死循环 ,假如接收缓存区恰好存满,是不是需要接收缓存区再增加一个数据,getchar()才能读入数据?

出0入0汤圆

发表于 2012-4-3 14:01:53 | 显示全部楼层
1.书上这段开始的程序源于CVAVR系统自动产生代码,主要是用于介绍一种方法和思路:采用中断+缓冲来实现高效率的串行通信过程。CVAVR产生的这段代码,只是给出了基本的框架和思路,具体实现上给出了简单过程,对于接收部分处理的不够细致,楼上几位能够体会到非常不错。

2.在实际的应用中,不应该是照搬代码,而是吸收好的部分,改进不足的部分。我书中后面的实际应用例子中,都是采用的这种方式,但USART的接收部分采用更加合适的处理方法,请参考本书后面的实际应用例子。

通信是双方的合作的过程,对于接收方来讲,由于是被动一方,所以处理起来比较困难,也容易出问题。因为,你不知道发送方什么时间发送的,发送了几个,发送过程中是否出错,等等。因此接收方必须根据实际情况,采用符合实际需要的接收和判断方式的。

楼上两位提出的关于rx_counter的问题,并不是非常重要的。rx_count为7,或8表示队列已满都可以(当然实际上=8为满),更关键的是,你的上层是否能及时读走队列中的数据。实际上超过5就危险了,说明你的上层处理数据速度跟不上。

rx_counter = 0,此时不管什么情况下,只能认为数据为空,需要接收缓存区再增加一个数据,getchar()才能停止死循环,读走一个数据。但此时的数据是否可靠还是问题的。CVAVR的原代码,并没有考虑如此的细致。所以实际使用中需要改进。




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

本版积分规则

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

GMT+8, 2024-4-27 00:11

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

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