[51单片机] 大数据传输过程中波特率变化

[复制链接]
4409|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 | 显示全部楼层
不用怀疑了,程序问题
dictionary 发表于 2013-11-26 08:29 | 显示全部楼层
数据量太大也会出现波特率错误的现象的,PC的时钟和MCU的时钟不可能一样的,所以传输的位越多这种错误就积累越多到最后就错掉了
ayb_ice 发表于 2013-11-26 08:37 | 显示全部楼层
dictionary 发表于 2013-11-26 08:29
数据量太大也会出现波特率错误的现象的,PC的时钟和MCU的时钟不可能一样的,所以传输的位越多这种错误就积 ...

你开什么玩笑,
开始信号,停止信号是用来干嘛的
dictionary 发表于 2013-11-26 08:37 | 显示全部楼层
说实话把这技术告诉你算是你有缘分了,你做一个循环缓冲区,只要一收到数据就往里面丢,然后在主循环里去解析数据,有了一帧数据后再拷贝出来,处理掉。
缓冲区一共有四个属性 区域地址  区域大小 读偏移 写偏移   具体的不太好仔细讲  你自己试试吧
dictionary 发表于 2013-11-26 08:41 | 显示全部楼层
ayb_ice 发表于 2013-11-26 08:37
你开什么玩笑,
开始信号,停止信号是用来干嘛的

所以说数据量大的时候才会出现波特率偏移现象,这个我都在现实中遇到过了,还有很多国产“价廉物美”的232 或者485转换器根本就不能用很高的波特率,很容易出错!
ayb_ice 发表于 2013-11-26 08:47 | 显示全部楼层
dictionary 发表于 2013-11-26 08:41
所以说数据量大的时候才会出现波特率偏移现象,这个我都在现实中遇到过了,还有很多国产“价廉物美”的23 ...


等于白说了,
什么叫异步通信
dictionary 发表于 2013-11-26 09:32 | 显示全部楼层
还有你这样子做不能确定是波特率减半了,如果真是波特率减半,那么你按照减半的波特率发送应该是能传输成功的。
ljxh401 发表于 2013-11-26 10:10 | 显示全部楼层
一定是程序问题,不然51早就被K死了
wswh2o 发表于 2013-11-26 22:19 | 显示全部楼层
程序问题
kseeker 发表于 2013-11-27 01:04 | 显示全部楼层
八成是自适应程序在中间运行过,把波特率调了。如果你确定自适应的部分只运行过一次,最好检查一下下位机是否复位过。
kseeker 发表于 2013-11-27 01:05 | 显示全部楼层
dictionary 发表于 2013-11-26 08:29
数据量太大也会出现波特率错误的现象的,PC的时钟和MCU的时钟不可能一样的,所以传输的位越多这种错误就积 ...

UART的误差只在一个字节中累计。每个字节的开始都会重新同步。
ayb_ice 发表于 2013-11-27 08:11 | 显示全部楼层
kseeker 发表于 2013-11-27 01:05
UART的误差只在一个字节中累计。每个字节的开始都会重新同步。

说到点子上了
adef_13 发表于 2013-11-27 08:48 | 显示全部楼层
第一次听说波特率的问题,学习了
sunhq02 发表于 2013-11-27 09:06 | 显示全部楼层
dictionary 发表于 2013-11-26 08:41
所以说数据量大的时候才会出现波特率偏移现象,这个我都在现实中遇到过了,还有很多国产“价廉物美”的23 ...

貌似很牛X的样子
有点搞笑...
戈卫东 发表于 2013-11-27 12:48 | 显示全部楼层
估计是软件动了那个波特加倍的寄存器了.......
ayb_ice 发表于 2013-11-27 13:59 | 显示全部楼层
戈卫东 发表于 2013-11-27 12:48
估计是软件动了那个波特加倍的寄存器了.......

这个可能性大
dictionary 发表于 2013-11-27 15:49 | 显示全部楼层
这个没程序也看不出来 楼主 麻烦给个程序看看
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

18

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部