【原创】STM32复位后遥控数据出错的解决方法
![TANGX](https://hz-rm-bbs-web-prod.oss-cn-hangzhou.aliyuncs.com/avatar/pre/v1/000000298_avatar_big.jpg)
本帖最后由 TANGX 于 2015-6-5 18:14 编辑
DR16接收机的Dbus取反后接到STM32串口的RX脚,使用官方遥控器控制协议V1.4.pdf 中提供的参考代码接收数据,可以正常接收。在DMA中断里面加上IO翻转后,可以通过逻辑测试仪看到如下波形:
如上图所示,18个字节发送约2ms多,周期约14ms(和手册里的7ms有出入),18个字节接收完毕后进入DMA中断,解析各个字节的信息。另一个串口打印出的解析后的遥控数据如下(四个通道摇杆均在中位,S1、S2中位,未接入键鼠信息):
但经过测试,在接收机一直上电的情况下,复位STM32,有时会出现如下图的波形,DMA在18个字节未传输完成的时候就中断了:
另一个串口打印出的解析后的遥控数据如下(四个通道摇杆均在中位,S1、S2中位,未接入键鼠信息):
究其原因,是复位并配置好串口后,串口收到的第一个字节有可能不是一帧(18个字节)中的第一个字节,而DMA只管18个字节中断一次,所以就会出错。出错的概率大约为2/14,14%。
解决的方法就是让串口接收到的第一个字节是一帧中的第一个字节,可以算好时间后让接收机和STM32同时上电,保证接收数据正确。但在调试过程中,难免会经常复位,所以最好能在代码里面解决这个问题。
由于Dbus的数据中不包含帧头或帧尾之类的标识信息,所以不能通过识别标识信息的方法来解决这个问题。笔者解决这个问题的思路大致为:首先开启串口的接收中断,当串口收到第一个字节的时候进入中断服务函数,在中断服务函数里面重置串口(重置后不会再进入串口接收中断),延时3ms,延时结束的时候肯定就是在两帧信息的间隔里面,然后再配置并开启DMA,这样DMA传输的第一个字节必然就是一帧的首字节。经笔者的测试,这种方法效果良好:
如上图所示,就算串口收到的第一个字节不是帧首字节,DMA也能正确的接收后续的数据。
请问这篇文章对你有用吗?