STM32L4系列串口接收不定长数据
序言
由于毕设需要用到STM32L4系列的单片机,而网上关于这款单片机的资料较少,把串口这块完全弄好着实费了我一大把力气,在此将自己的成果与大家分享一波,希望大家能够借此少踩一些坑。同时很感谢前辈们提供的一些资料。下面进入正题。
概述
在网上查找资料的时候发现接收不定长数据的方式有挺多的,主要有以下几种:
- 通过检测特殊的标志符来确定数据接收完成。
例如在接收的数据尾端添加一个“0X4A”,如果检测到“0X4A”就说明接收完成,可以进行后续的操作。但该方法的缺点是无法适用于未知的接收数据,因为你不可能在未知的接收数据后面加一个特殊的标识符。 - 通过设置定时器来强制结束接收过程。
例如设置一个10ms的定时,当定时器溢出时,强制退出接收过程。一般来说接收不定长的数据这种方法是可以用的,但缺点是当接受未知长度数据时,该方法就显得很鸡肋,设置多长时间的定时才能够完整接收全部数据呢?难道对于不同的数据长度还要i计算不同的时长? - 通过设置IDLE中断来确定一帧数据接收完成。
这个方法也是我所使用和推荐的方法。STM32L4系列是有IDLE功能的,但是它的库函数里边没有写上这个中断的判断函数,需要我们自己加上(在下文会有叙述)。一帧数据是由许多个字节所组成的,对于字节的接收需要用到RXNE这个接收中断。接收到一个字节后,将在中断函数HAL_UART_RxCpltCallback中进行相应处理。接收完一帧数据后,将在中断函数HAL_UART_IdleCpltCallback中进行相应处理。这样,一帧数据就接收完了,下面是具体细节。