在我们使用STM32系列开发的过程中,经常会用到USART串口来传输数据,小编近期正好处理了两种串口数据:subs信号和惯导信号。遇到了一些问题,有一些心得体会在这里分享一下。
首先基本交接一个最基本的概念,波特率——在串口通信中波特率就是每秒能传输的数据位,波特率9600就是每秒能传输9600位,1Word=2byte、1byte=8bit,这里的9600位指的是9600bit。为什么先引入波特率呢,一个是串口通信中波特率是什么重要的一个参数,另一个是引入传输速度不同,带来的的问题,丢帧是常见的问题之一。这也是本文所分享的为什么会用到环形缓冲区这样一个方法。
小编最近处理的惯导数据波特率较大为307200,字节数较多,打次使用printf函数打印,占用了不少时间,如下图。在小编没有用环形缓冲区之前,会不断丢失4帧帧数据。导致系统正在处理这帧数据时,新的帧数据不断发送过来,来不及处理就被下一帧数据覆盖了。
下面是小编所使用的方法,首先要定义一个二维数组来存放我们的数据帧,具体给多大空间,需要根据我们程序合理判断。简单介绍一下,内存拷贝函数memcpy,函数原型:void *memcpy(void *dest, const void *src, size_t n),memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。这一步即是将我们的多帧串口数据保存到了我们定义的这个二维缓冲数组里。
下图是读取和使用这个缓冲数组,重点是下图的最后几行,关键点就是储存和读取处理时用两个变量,本文使用的j、k来实现。
长按下图关注此公众号,串口通信相关问题可以后台留言小编一起讨论。