两片STM32之间在高倍波特率下进行uart数据通信

项目背景

  • 需要用到两片stm32f103rct6进行UART串口单工通信,只需要从A发到B,通信的波特率越快越好。
  • stm32的uart最大通信波特率可以达到4.5MBit/s;

通信帧格式

帧头0xAA 状态表示1Byte 数据位12Byte
  • 共14个Byte,无帧尾;

通信实验遇到的问题

  • 实验平台:cubeMX+visual GDB+USB虚拟串口;
  • 在CubeMX中配置uart的最高波特率是115200bps;
  • USB虚拟串口向PC打印串口接收到的字节;
  • 波特率=115200bps,通信正常;
  • 波特率=115200bps*8=921600bps,通信正常;
  • 波特率=115200bps*9=1036800bps,通信不正常,数据错位;
  • 再提高波特率,数据依然错位;
  • 官方给的通信波特率不是可以达到4.5Mbps吗?怎么才这么点波特率就数据传输错误了?

数据传输错位原因分析

  • 猜测的原因是在高倍的波特率下,A,B两个设备如果启动时间有延迟的话可能会引起B设备接收数据错位。比如A启动起来已经发送数据了,可能时钟已经传到B好几个时钟周期了(就是说已经传到B好几个字节了),B才启动完毕进入接收数据状态,那么这时B可能就会错过一开始传过来的几个字节。接下来B就会保持错位的数据帧格式进行数据接收。

数据传输错位的解决方法

  • 解决A,B两个设备启动时序不一致的问题。比如A可以延迟一会等待B准备好再发数据;
  • 另一种方法可以从根本上解决数据错位的问题,那就是使用“异步发送,同步接收”的方法;

我用的最高波特率

  • 在串口接收回调函数中使用“异步发送,同步接收”之后,我测试115200bps*9=1036800bps,通信正常;
  • 我测试的最高波特率是115200bps*20=2304000bps,通信正常,这个波特率满足我的应用绰绰有余。
  • 再高的波特率没测试过,但我觉得实现4.5Mbps不是梦。

猜你喜欢

转载自blog.csdn.net/aqwtyyh/article/details/105334441