打印
[51单片机]

大数据传输过程中波特率变化

[复制链接]
3616|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zmwss|  楼主 | 2013-11-25 23:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zmwss 于 2013-11-25 23:29 编辑

大家好,遇到一个非常离奇的怪事,
PC和一颗51的MCU在串口通信时,大数据传输过程中,发现波特率减半。
具体过程如下:
1.PC端设置115200波特率
2.MCU上电,和PC自适应波特率成功。
3.开始数据传输、交互,pc端送60K数据给MCU,每帧数据135BYTE,每帧数据包括 :头 + 包号 + 128byte data +checksum. MCU先收完一帧数据,再判断头、 checksum是否正确,不对给PC端送出错机制AAH ,要求PC重新送前一帧数据。
  PC端送完一帧数据后,接收MCU的应答信息(出错信息AAH 和解码成功信息55H), 如果2秒内没有接收到AA或55就重新送前一帧数据。
4.发现在大多数时候60K数据通信是成功的,没有问题,但偶尔会中断,提示重新送前一帧数据,就是发生了出错处理,不管重发多少次都不能重新建立通信。
5.用一个串口监控工具,监控MCU的RXD端PC重发的一帧数据也是按PC端的波特率送下来该帧数据,用监控工具监控MCU TXD端此时反馈回来的却是98H E6H。
6.调整监控工具的波特率为57600,正好是AAH.
7.初步可以判定MCU在收发数据过程把自适应设置好的波特率115200给改到了57600.导致接收的135BYTE数据不对,从而帧头和checksum出错,下位机送AAH,而此时由于波特率变为57600,导致PC收到98H E6H,从而通信中断。

麻烦各位帮忙分析下,怎么MCU设置好的波特率会发生改变,从115200变到57600.而大多数时候又能正确通信成功。谢谢!



相关帖子

沙发
jt4117| | 2013-11-25 23:11 | 只看该作者
你这个出错机制有问题。 应该是用应答机制。 收到一包数据,给PC应答包。 PC根据接收到得应答包来决定发什么数据。 如果是解码失败,那重发。 如果是解码成功,那么再发下一包。 这样才合理。
你说的出错了才发错误识别码。 不是实时的。可能下位机已经接收到了pc发来的N多数据。 你的整个控制都乱了。  也不知道啥时候包错了。

使用特权

评论回复
板凳
zmwss|  楼主 | 2013-11-25 23:25 | 只看该作者
本帖最后由 zmwss 于 2013-11-25 23:33 编辑

谢谢jt4117 的回复,我现在就是收完一帧数据,再去解数据,先解帧头,再解checksum,只要其中一个出错了,我会回出错信息给PC, pc收到出错信息,重发前一帧数据,如果解码OK了,MCU回解码成功的信息给PC,PC收到应答就送下一帧数据.
pc发完一帧数据后就接收MCU的应答,没有收到出错信息或解码成功的信息,每过2秒再重发前一帧数据。

使用特权

评论回复
地板
ayb_ice| | 2013-11-26 08:12 | 只看该作者
不用怀疑了,程序问题

使用特权

评论回复
5
dictionary| | 2013-11-26 08:29 | 只看该作者
数据量太大也会出现波特率错误的现象的,PC的时钟和MCU的时钟不可能一样的,所以传输的位越多这种错误就积累越多到最后就错掉了

使用特权

评论回复
6
ayb_ice| | 2013-11-26 08:37 | 只看该作者
dictionary 发表于 2013-11-26 08:29
数据量太大也会出现波特率错误的现象的,PC的时钟和MCU的时钟不可能一样的,所以传输的位越多这种错误就积 ...

你开什么玩笑,
开始信号,停止信号是用来干嘛的

使用特权

评论回复
7
dictionary| | 2013-11-26 08:37 | 只看该作者
说实话把这技术告诉你算是你有缘分了,你做一个循环缓冲区,只要一收到数据就往里面丢,然后在主循环里去解析数据,有了一帧数据后再拷贝出来,处理掉。
缓冲区一共有四个属性 区域地址  区域大小 读偏移 写偏移   具体的不太好仔细讲  你自己试试吧

使用特权

评论回复
8
dictionary| | 2013-11-26 08:41 | 只看该作者
ayb_ice 发表于 2013-11-26 08:37
你开什么玩笑,
开始信号,停止信号是用来干嘛的

所以说数据量大的时候才会出现波特率偏移现象,这个我都在现实中遇到过了,还有很多国产“价廉物美”的232 或者485转换器根本就不能用很高的波特率,很容易出错!

使用特权

评论回复
9
ayb_ice| | 2013-11-26 08:47 | 只看该作者
dictionary 发表于 2013-11-26 08:41
所以说数据量大的时候才会出现波特率偏移现象,这个我都在现实中遇到过了,还有很多国产“价廉物美”的23 ...


等于白说了,
什么叫异步通信

使用特权

评论回复
10
dictionary| | 2013-11-26 09:32 | 只看该作者
还有你这样子做不能确定是波特率减半了,如果真是波特率减半,那么你按照减半的波特率发送应该是能传输成功的。

使用特权

评论回复
11
ljxh401| | 2013-11-26 10:10 | 只看该作者
一定是程序问题,不然51早就被K死了

使用特权

评论回复
12
wswh2o| | 2013-11-26 22:19 | 只看该作者
程序问题

使用特权

评论回复
13
kseeker| | 2013-11-27 01:04 | 只看该作者
八成是自适应程序在中间运行过,把波特率调了。如果你确定自适应的部分只运行过一次,最好检查一下下位机是否复位过。

使用特权

评论回复
14
kseeker| | 2013-11-27 01:05 | 只看该作者
dictionary 发表于 2013-11-26 08:29
数据量太大也会出现波特率错误的现象的,PC的时钟和MCU的时钟不可能一样的,所以传输的位越多这种错误就积 ...

UART的误差只在一个字节中累计。每个字节的开始都会重新同步。

使用特权

评论回复
15
ayb_ice| | 2013-11-27 08:11 | 只看该作者
kseeker 发表于 2013-11-27 01:05
UART的误差只在一个字节中累计。每个字节的开始都会重新同步。

说到点子上了

使用特权

评论回复
16
adef_13| | 2013-11-27 08:48 | 只看该作者
第一次听说波特率的问题,学习了

使用特权

评论回复
17
sunhq02| | 2013-11-27 09:06 | 只看该作者
dictionary 发表于 2013-11-26 08:41
所以说数据量大的时候才会出现波特率偏移现象,这个我都在现实中遇到过了,还有很多国产“价廉物美”的23 ...

貌似很牛X的样子
有点搞笑...

使用特权

评论回复
18
戈卫东| | 2013-11-27 12:48 | 只看该作者
估计是软件动了那个波特加倍的寄存器了.......

使用特权

评论回复
19
ayb_ice| | 2013-11-27 13:59 | 只看该作者
戈卫东 发表于 2013-11-27 12:48
估计是软件动了那个波特加倍的寄存器了.......

这个可能性大

使用特权

评论回复
20
dictionary| | 2013-11-27 15:49 | 只看该作者
这个没程序也看不出来 楼主 麻烦给个程序看看

使用特权

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

本版积分规则

7

主题

18

帖子

0

粉丝