坛友原帖链接:
https://bbs.eeworld.com.cn/forum. ... p;page=1#pid2086178
单片机:C52内核单片机,晶振11.0592MHz,运行在12T模式,波特率为9600bps,8位数据位,1位停止位,串口工具使用ECOM V2.8版本
1、我先描述一下问题,上代码图和实测图:
代码图:就这么多的代码,首先硬件串口使用定时器1作为波特率发生器,产生9600bps的波特率,之后的主要功能是不断查询接收中断标志位,当收到一个字节时,再将该字节发送出去,同时再多发送一个0x01,如此往复,代码比较简单,我就不多说了。
实际测试效果:一次发送“abc1"四个字符数据,但是接收到数据经过分析可以看出来只返回了三次数据,经过我多次测试发现前三个字符正常接收处理,最后一个字符”1“丢失的概率最大,然后就是第三个字符“c”会偶尔丢失,其他三个字符接收处理正常的现象。我在坛友的原帖中有猜测的原因是单片机来不及处理数据导致数据丢失,为了验证我的猜想,也是让那位坛友知道问题的所在,我根据他提供给我的信息实际搭了类似的平台进行测试,使用逻辑分析仪抓取数据进行分析。
二、我的分析结果如下:
以上是我从书上获取到的关于51单片机硬件串口的描述信息,其中作标记的部分说到串行接收的双缓冲结构,这说明在没有读走接收SBUF中的数据时仍然可以继续接收数据;
从书中作标记的部分可以知道,硬件串口在接收每一位时,采样点是每个位的中央位置,也就是说到这个中央位置确定电平之后这一位就算是接收完成了,该位会被送入移位寄存器中了。
从书中作标记的部分可以知道要想最终完成一个字节数据的接收,必须在接收到该字节的最后一位时RI = 0,而且SM2 = 0或者接收的停止位 = 1;如果这两个条件不能同时满足,则该字节数据会被丢弃,不会被移动到接收SBUF中去(此点是本帖问题的关键点)。
使用逻辑分析仪抓到的数据:
丢失最后一个字符时的波形数据:文中对每个关键点进行了分析,可以看到在接收到最后一个字符“1”的最后一位停止的时候,此时程序上还在发送第四个数据(第二个字符需要发送的0x01),同时分析可得此时早已在SBUF中接收到了第三个字符“c",但是还在等待下一次处理,此时RI=1,所以不满足接收条件,移位寄存器中接收到的最后一个字符“1”被无情丢弃,问题就是这样出现的。
这个是丢失第三个字符“c”的波形图:单片机在接收到第一个字符“a”,RI置1,在while(1)大循环中检测到RI=1,然后进入处理流程,将RI置0,然后从接收SBUF中读取字符“a”,然后将该字符发送出去,然后等待发送完成,从图中可以看到,在发送数据的同时,硬件串口也在接收数据,在第一个数据还没有发送完成的时候已经接收到了第二个字符“b”的最后一位停止位,此时RI=0,满足接收条件,RI置1,数据被移动到接收SBUF中,完成接收。回到发送这边,第一个数据发送结束后,开始发送第二个数据0x01,然后等待发送完成。再结合波形图可以看到,此时已经在接收第三个字符“c”了,结果是还没有发送完第二个字节就已经收到第三个字符的最后一位停止位了,而此时第二个字符还在等待处理,RI=1,不满足接收条件,移位寄存器中接收到的第三个字符“c”被无情丢弃。然后继续接收第四个字符“1”,这个时候第二个字节才发送完成。接着处理接收SBUF中的第二个字符“b”,RI置0,然后开始发送第三个字节,然后等待发送完成,而在等待的同时,已经接收到了第四个字符“1”的最后一位停止位,而此时RI=0,满足接收条件,数据被移动到接收SBUF中,RI置1,到此所有接收数据完成,只要按部就班的执行完数据发送英语学习算是结束了。
3、总结:问题出现的原因和猜测的一样,是由于处理接收数据不及时,所以出现了数据丢弃的情况。而另外一个有时丢失第三个字符,而有时丢失第四个字符的问题则是不随机的,这跟发送的数据的时机有关(接收到第一个字符,RI置1后到被处理的时间间隔长短决定丢失哪个字符)。我想如果再发多一点数据的话(可惜忘记测试了),这个现象就会表现为不规律丢失其中的一个或者多个字符,一次性发送的字符越多,丢失的就越多。要解决这样的办法也就显而易见了,那就是要保证处理接收的速度要比处理数据的速度要快才不会出现丢失数据的情况。
本文来自论坛,点击查看完整帖子内容。