打印

有趣的问题,MCU串口中断连续发送一串数据,PC接收端会误码

[复制链接]
7105|29
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gx_huang|  楼主 | 2012-12-5 13:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
51 MCU的串口发送很有意思:
先发送起始位,再发8个数据位,在发送停止位的瞬间,TI置1,如果打开中断,在中断程序里立即发送下一个字节。但是实际发送是和16分频后的时钟同步的,如果发送的是0X55数据,则就是周期的方波输出。如果每隔1S发送一串比较长的字符串,比如20字节,波特率9600,PC接收端会偶尔误码。也就是说,当停止位的宽度是1bit宽度时,PC连续接收会偶尔误码。如果在中断程序里人为加一个延时,这样停止位后面再加1bit的高电平,PC接收就不会误码了。
大家说:难道PC的串口接收电路或者程序有BUG吗?
按道理,在2个字节之间无需增加额外的延时。
准备MCU发,MCU接收,测试一下看看MCU接收是否会误码。

相关帖子

沙发
icecut| | 2012-12-5 13:44 | 只看该作者
你确认设置都是n81不是一个n81一个n82,或者有些芯片支持n8 1.5

使用特权

评论回复
板凳
gx_huang|  楼主 | 2012-12-5 13:50 | 只看该作者
标准的51,模式1,一个起始位,8个数据,1个停止位。
PC是用串口助手,一样设置。
发送波形都用示波器看过了。

使用特权

评论回复
地板
jlass| | 2012-12-5 13:53 | 只看该作者
当停止位的宽度是1bit宽度时,PC连续接收会偶尔误码。如果在中断程序里人为加一个延时,这样停止位后面再加1bit的高电平,PC接收就不会误码了。

这种问题一般是你的电路画的有缺陷,处于某种临界点

使用特权

评论回复
5
duhemayi| | 2012-12-5 14:13 | 只看该作者
没看懂是什么意思?

使用特权

评论回复
6
shenzhenherry| | 2012-12-5 16:54 | 只看该作者
串口通讯,收发2端的协议要完全一致,即:波特率,8+N+1

使用特权

评论回复
7
ZG11211| | 2012-12-5 17:42 | 只看该作者
1:串口中断非优先,会被其它中断干扰,程序设计时需要充充分考虑这个问题,
2:串口接收一个字节以后需要喘息处理,否则报错是自然的。

使用特权

评论回复
8
gx_huang|  楼主 | 2012-12-5 18:26 | 只看该作者
LS几位老弟,看仔细了。
串口发送肯定不会错的,是PC接收错了。
设置不会错。
硬件电路更加不会错了,标准的电路。
我只是描述一种故障现象。

使用特权

评论回复
9
gx_huang|  楼主 | 2012-12-5 20:08 | 只看该作者
最新测试:
MCU周期性发一串数据,MCU接收,也会偶尔误码。
但是PC周期性发一串数据,MCU接收,不会误码。
测试PC和MCU的发送波形,没有任何差别。

不过,最终还是找到原因了,把MCU的内部RC振荡器改为晶体振荡器,故障消失了。
显然是波特率有轻微误差,连续不间断发很多数据,会导致接收错误,如果延时1bit时间,就好了。
也许是内部RC振荡器的频率不稳定,也许是现有的UART接收起始位同步电路设计问题。

使用特权

评论回复
评论
望断云山 2012-12-5 22:23 回复TA
用内部rc振荡器居然敢做通讯,还怀疑pc有设计缺陷,呵呵 
10
gx_huang|  楼主 | 2012-12-5 20:16 | 只看该作者
如果波特率有误差,如果发送的速度比接收的快一点,即使误差在2.5%以内,连续发送,也可能导致错误。
本来,只要波特率误差在一定范围内,比如一个字节有10bit,只要最后1bit能正确判断高低电平,就不应该误码。
现在误码了,怀疑UART电路设计有BUG。

使用特权

评论回复
评论
望断云山 2012-12-5 22:26 回复TA
不要怀疑了,内部rc振荡器是不能用于通讯的,有通讯必须用晶振,不然会死得很惨! 
11
明月小厨| | 2012-12-5 23:24 | 只看该作者
发数据的一方没有任何责任;这个串口的速度以前跑9600,现在已经有人要求跑MHZ级别了;
误码的出现判断:一个字节一个字节,中间加延时1秒;波特率速度随便设:如果仍有误码说明传输的线路不行,驱动能力不够;

使用特权

评论回复
12
明月小厨| | 2012-12-5 23:26 | 只看该作者
如果不加延时,一直发送;测试的目的,判断PC端软件的处理能力;
不是接收的能力,是接收后的处理的能力;来不及处理的报错或丢掉,具体处理的逻辑要问PC端的程序员,他是怎么做的.

使用特权

评论回复
13
明月小厨| | 2012-12-5 23:28 | 只看该作者
9600都误码,那真的太意外太垃圾了;

使用特权

评论回复
14
明月小厨| | 2012-12-5 23:30 | 只看该作者
如果距离不远直接一对一;100KHZ以上轻松完成;

使用特权

评论回复
15
jlass| | 2012-12-6 08:37 | 只看该作者
楼上的激动了

使用特权

评论回复
16
gx_huang|  楼主 | 2012-12-6 08:45 | 只看该作者
偶尔激动的才好。有激情才有动力。
怕大家还不理解,特别重复说明如下:
如果收发的波特率有轻微的误差,数据格式、波特率设置完全正确,如果发送方周期性的连续发送一帧数据,当然,帧和帧之间还是有空隙的,接收方会偶尔误码。以前也发现有误码,由于软件有错误检测,发现错误要求重发,不会影响实际使用。现在别人的软件没有启动错误检测,导致经常错误操作。这才深入研究。

使用特权

评论回复
17
受不了了| | 2012-12-6 09:28 | 只看该作者
本帖最后由 受不了了 于 2012-12-6 09:29 编辑

在办公室环境,9600发个几天几晚都不会有误码

使用特权

评论回复
18
明月小厨| | 2012-12-6 12:45 | 只看该作者
我是意思是收发过程绝对是有保障的;收到数据后处理需要时间的,PC端不可能实时等你送数据.PC机经常还死机呢;
不是说PC有这个问题,就是单片机也同样存在,如果跑操作系统,串口使劲发数据,收到数据后再实时处理;这边还没处理完,新的数据又来了;这就是大信号量处理时的堵塞.
编程时要特别小心这一点;任何资源都是有限的.包括处理时间.

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
ZG11211 + 3 赞一个!
19
明月小厨| | 2012-12-6 12:52 | 只看该作者
例说,
上位机通过串口发数据过来,下位机收到后把数据写入EEPROM;
如果是写入的速度非常快,没事;
如果写入的速度不够快,这边还要忙着写数据,新的数据又到了;
你设缓冲区,缓解一下;但缓冲区有多大,溢出后系统崩溃了;
如果你用了操作系统,更麻烦了,操作系统占了不少的资源,(时间和内存);

跑操作系统莫名其妙死机是不是经常发生啊~~~~~~~

使用特权

评论回复
20
xuyaqi| | 2012-12-6 13:07 | 只看该作者
本帖最后由 xuyaqi 于 2012-12-6 13:59 编辑

楼主:你用的是什么串口调试软件,你用这个 串口调试 试试。 sscom32串口调试.rar (276.73 KB)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:移动通信设计,GPS防盗定位终端设计。各种电子产品设计,温度仪表设计专家。

50

主题

9037

帖子

79

粉丝