STM32
直播中

李敏

7年用户 1354经验值
私信 关注
[问答]

如何利用两片stm32f103rct6进行UART串口单工通信呢

如何利用两片STM32f103rct6进行UART串口单工通信呢?遇到了哪些问题呢?

回帖(1)

黎蔼焱

2021-12-14 14:55:43
项目背景




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

通信帧格式

[tr]帧头0xAA状态表示1Byte数据位12Byte[/tr]



  • 共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不是梦。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分