串口调试小结

       这个项目是将蓝牙模块与NFC模块集成在一起,做一个demo。两个模块之间使用串口通信,两个模块上的mcu均为STM32系列,NFC模块上还有两个串口,一个作为log,一个作为AT通道,与上位机通信。

       之前由于NFC模块与上位机的串口通信,以及log都调通,所以这次只需要将与蓝牙模块的串口通信调通即可。硬件连接完毕后,就开始调试。当此串口初始化后,通过它向蓝牙模块通过查询的方式发数据很快就调通了。接下来就是要能接受蓝牙模块发过来的数据,采用中断方式。AT串口的中断优先级为15,如果这个串口的优先级设置为相同的值,发现中断处理函数不会被触发,于是将优先级改为14。这样,蓝牙发过来的数据就被中断函数处理了。接下来,要把接收到的蓝牙数据解析成一帧一帧的数据供应用层解析。当蓝牙模块与其他的蓝牙模块建立连接时,会发如下数据:

       0D 0A RING 0D 0A 0D 0A CONNECT 0D 0A,即2帧数据。中断一次处理一个字符,当检测到接收的字节为0A,并且之前的字节为0D,并且不是帧开始的时候,认为一帧数据接收完成,将其值从另一个串口打印出来。继续接收下一帧。结果第一帧数据能完整的显示出来,而第二帧数据丢了很多数据,包括分隔符(0D 0A)仅5个字节。接收缓冲区也开得足够大不至于溢出。百思不得其解。于是先不解析数据,看是否能将数据完整的接收下来,连续的接收到的字符存储在缓冲区,结果所有的数据都能接收(接收一个,就打印一个)。又通过saleae analysizer,抓取串口线上的数据,发现也是ok的。那就是解析的地方出了问题。尝试了很多方法,都失败。最后怀疑是不是解析完一帧数据,打印其值时花费了太多的cpu,导致了后面的数据丢失了。于是将打印帧内容去掉,改为将帧的内容通过消息发到另外一个task,问题就解决了。果然是打印帧值耗时太多,才导致了后面会丢失数据。因此,在中断里,尽量少做大量I/O的操作。其次,蓝牙发的两帧数据时连续发出来的,中间没有间隔与停顿所以才导致了丢包。

      总的来说,这个项目调试还是蛮顺利的。以后一定要进一步熟悉蓝牙模块。

猜你喜欢

转载自blog.csdn.net/setagllib/article/details/23347047