qiuxiangkai 发表于 2009-9-20 11:34:08

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

在接收中断中有一句

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

{
      rx_counter = 0;      //队列满了

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

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

cyr_hongfeng 发表于 2009-9-20 11:48:40

0-7不就是 8吗?

machao 发表于 2009-9-20 12:51:44

C语言的数组(BUFFER)是从0开始的。这是最基本的东西了。

qiuxiangkai 发表于 2009-9-20 21:33:55

艾,真是不好意思,队列数组用到三个指针,前两个我都理解是0到7算起的,就糊涂地把这个指针从1算起了。

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

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

sun6123432 发表于 2012-3-26 22:16:11

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

machao 发表于 2012-4-3 14:01:53

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

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

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

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

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




页: [1]
查看完整版本: 马老师书中usart接收数据缓冲队列中一个指针的疑惑