12610|34

1976

帖子

1

TA的资源

五彩晶圆(初级)

楼主
 

探讨分析坛友遇到的51单片机硬件串口数据丢包的真相 [复制链接]

 
坛友原帖链接:https://bbs.eeworld.com.cn/forum ... 2&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后到被处理的时间间隔长短决定丢失哪个字符)。我想如果再发多一点数据的话(可惜忘记测试了),这个现象就会表现为不规律丢失其中的一个或者多个字符,一次性发送的字符越多,丢失的就越多。要解决这样的办法也就显而易见了,那就是要保证处理接收的速度要比处理数据的速度要快才不会出现丢失数据的情况。

此帖出自单片机论坛

最新回复

学习了,谢谢! 发一串口工具,大家试用一下,请多提建议。  详情 回复 发表于 2016-11-26 11:54

赞赏

1

查看全部赞赏

点赞 关注(2)
 

回复
举报

7

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
好严谨,好细致,好详细,太棒了。太感谢了。
此帖出自单片机论坛

点评

大家一起探讨~  详情 回复 发表于 2016-11-4 19:43
 
 

回复

7

帖子

1

TA的资源

一粒金砂(初级)

板凳
 
厉害
此帖出自单片机论坛
 
 
 

回复

305

帖子

0

TA的资源

一粒金砂(中级)

4
 
有的时候可能是串口工具的问题
此帖出自单片机论坛

点评

当时我也怕是串口工具有问题,所以才照着那位坛友把他测试用的软件和参数都尽量保证一样,实际测出的现象跟他说一致,通过使用逻辑分析仪进行分析,串口工具是没有问题的,问题还是处理速度比接收速度慢,才出现的丢  详情 回复 发表于 2016-11-4 19:47
楼主分析得很详细,学习了。使用逻辑分析仪抓的波型数据在时序上还是有着比较高的准确度,我手里也有一个,对于低速通信协议的调试还是相当好用的,从图中看到串口工具发出来的数据是没有问题的,单片机接收也没有问  详情 回复 发表于 2016-11-4 09:57
 
 
 

回复

30

帖子

1

TA的资源

一粒金砂(中级)

5
 
不是双缓冲,我处理收发的时候要锁住串口,有点类似于原子操作
此帖出自单片机论坛

点评

不能叫严格意义上的双缓冲,但是结构上可以算双缓冲,这样才能不停的接收数据。你说你在收发的时候要锁住串口,这个在大多数情况下没有必要,你只要保证处理的速度大于接收的速度就没有问题,再配合内存中开辟的缓冲  详情 回复 发表于 2016-11-4 19:51
 
 
 

回复

578

帖子

0

TA的资源

纯净的硅(初级)

6
 
kk118a 发表于 2016-11-4 00:51
有的时候可能是串口工具的问题

楼主分析得很详细,学习了。使用逻辑分析仪抓的波型数据在时序上还是有着比较高的准确度,我手里也有一个,对于低速通信协议的调试还是相当好用的,从图中看到串口工具发出来的数据是没有问题的,单片机接收也没有问题。
此帖出自单片机论坛

点评

谢谢~  详情 回复 发表于 2016-11-4 23:02
 
个人签名刻苦学习,共同进步
 
 

回复

84

帖子

0

TA的资源

一粒金砂(中级)

7
 
原来不是在中断中处理的接收数据啊,那这种情况下丢数据确实是可能的
此帖出自单片机论坛

点评

原理上不管在哪里处理接收到的数据,只要处理的速度比接收的速度快就不会丢数据  详情 回复 发表于 2016-11-4 23:03
 
 
 

回复

113

帖子

0

TA的资源

一粒金砂(中级)

8
 
你用2400bps也会出问题么?
此帖出自单片机论坛

点评

理论上不管是多大的波特率,只要处理的速度比接收的速度慢都会出问题  详情 回复 发表于 2016-11-4 23:05
 
 
 

回复

1976

帖子

1

TA的资源

五彩晶圆(初级)

9
 
phang 发表于 2016-11-4 01:23
好严谨,好细致,好详细,太棒了。太感谢了。

大家一起探讨~
此帖出自单片机论坛
 
 
 

回复

1976

帖子

1

TA的资源

五彩晶圆(初级)

10
 
kk118a 发表于 2016-11-4 08:51
有的时候可能是串口工具的问题

当时我也怕是串口工具有问题,所以才照着那位坛友把他测试用的软件和参数都尽量保证一样,实际测出的现象跟他说一致,通过使用逻辑分析仪进行分析,串口工具是没有问题的,问题还是处理速度比接收速度慢,才出现的丢数据
此帖出自单片机论坛
 
 
 

回复

1976

帖子

1

TA的资源

五彩晶圆(初级)

11
 
本帖最后由 bobde163 于 2016-11-4 19:53 编辑
blg0507 发表于 2016-11-4 09:35
不是双缓冲,我处理收发的时候要锁住串口,有点类似于原子操作

不能叫严格意义上的双缓冲,但是结构上可以算双缓冲,这样才能不停的接收数据。你说你在收发的时候要锁住串口,这个在大多数情况下没有必要,你只要保证处理的速度大于接收的速度就没有问题,再配合内存中开辟的缓冲区就更好。还有你提到的“原子操作”是什么东西?
此帖出自单片机论坛
 
 
 

回复

1976

帖子

1

TA的资源

五彩晶圆(初级)

12
 
迈尔风随 发表于 2016-11-4 09:57
楼主分析得很详细,学习了。使用逻辑分析仪抓的波型数据在时序上还是有着比较高的准确度,我手里也有一个 ...

谢谢~
此帖出自单片机论坛
 
 
 

回复

1976

帖子

1

TA的资源

五彩晶圆(初级)

13
 
hljjxzhla 发表于 2016-11-4 10:24
原来不是在中断中处理的接收数据啊,那这种情况下丢数据确实是可能的

原理上不管在哪里处理接收到的数据,只要处理的速度比接收的速度快就不会丢数据
此帖出自单片机论坛
 
 
 

回复

1976

帖子

1

TA的资源

五彩晶圆(初级)

14
 
1071416541 发表于 2016-11-4 13:07
你用2400bps也会出问题么?

理论上不管是多大的波特率,只要处理的速度比接收的速度慢都会出问题
此帖出自单片机论坛
 
 
 

回复

606

帖子

20

TA的资源

一粒金砂(高级)

15
 
我看了下程序,就估计出问题所在了。所以接受一般都是在中断中处理。
此帖出自单片机论坛

点评

看完代码是大概知道是产生了丢包,但是现象还是比较奇怪的,发4个数据,有3个数据能正常,这也是跟所使用的单片机的内部原理有关系,如果没有这种“双缓冲”或者是像前面网友说的,在发数据的时候就不接收数据,那这  详情 回复 发表于 2016-11-8 12:03
 
 
 

回复

1976

帖子

1

TA的资源

五彩晶圆(初级)

16
 
ketose 发表于 2016-11-8 09:58
我看了下程序,就估计出问题所在了。所以接受一般都是在中断中处理。

看完代码是大概知道是产生了丢包,但是现象还是比较奇怪的,发4个数据,有3个数据能正常,这也是跟所使用的单片机的内部原理有关系,如果没有这种“双缓冲”或者是像前面网友说的,在发数据的时候就不接收数据,那这样数据丢得更多,或者是只能接收到第一个数据,后面的全都会丢失,所以还是需要了解一下更深层次的原因,像这次这种情况表象是单片机程序的问题,而且还是主要问题,其次内里问题那就是“双缓冲”接收-丢弃的机制问题,是次要问题,我们只要规避第一个问题就基本可以了
此帖出自单片机论坛
 
 
 

回复

253

帖子

0

TA的资源

一粒金砂(中级)

17
 
分析得很详细,学习了
此帖出自单片机论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(中级)

18
 
好贴,向楼主的严谨精神学习!!
此帖出自单片机论坛
 
 
 

回复

4008

帖子

0

TA的资源

版主

19
 
本帖最后由 huo_hu 于 2016-11-10 13:55 编辑

这个问题是你while(!TI)造成的,很明显你发的时候不能收,改成中断方式即可解
此帖出自单片机论坛

点评

不是发的时候不能收,而是收到了却不能放到SBUF中而被丢弃,这也是有时丢第三个字符而有时丢第四个字符的原因,从抓到的波形来看,只要在接收到第一个字符时到开始处理的这段时间有点点偏移就会有不一样的结果,这段  详情 回复 发表于 2016-11-11 01:55
 
 
 

回复

1976

帖子

1

TA的资源

五彩晶圆(初级)

20
 
huo_hu 发表于 2016-11-10 13:53
这个问题是你while(!TI)造成的,很明显你发的时候不能收,改成中断方式即可解

不是发的时候不能收,而是收到了却不能放到SBUF中而被丢弃,这也是有时丢第三个字符而有时丢第四个字符的原因,从抓到的波形来看,只要在接收到第一个字符时到开始处理的这段时间有点点偏移就会有不一样的结果,这段时间越长,第三个字符丢失的概率越大
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表