使用STM32串口中断实现非阻塞方式接收不定长数据

一、简介

1.1、开发环境

STM32CubeIDE V1.9。

1.2、实现功能

使用STM32的串口1,接收不定长数据,并返回接收数据。

二、步骤解析

2.1、配置串口

打开“Device Configuration Tool”(即STM32CubeMX),配置串口1。

注:一定要在“NVIC Settings”栏,勾选“USART1 global interrupt”打开串口中断。

2.2、初始化

初始化过程中,调用函数“HAL_UARTEx_ReceiveToIdle_IT”。

HAL库中对该函数的定义:

HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)。

huart:定义串口,一般填写 &huartx(x为串口号,取1、2、3……)。本案例使用串口1,则填写&huart1;

pData:接收数据存放的首地址,一般填写一维数组名;

Size:定义接收的字节长度,填写接收数据的最大字节数。

返回值为4种HAL State中的1种,HAL库中定义如下:

typedef enum 
{
  HAL_OK       = 0x00U,
  HAL_ERROR    = 0x01U,
  HAL_BUSY     = 0x02U,
  HAL_TIMEOUT  = 0x03U
} HAL_StatusTypeDef;

2.3、回调函数

调用函数“HAL_UARTEx_ReceiveToIdle_IT”后,当接收长度等于Size,或者串口接收数据过程中产生空闲时,会执行回调函数"HAL_UARTEx_RxEventCallback"。

HAL库中对该函数的定义:

__weak void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)

huart:回调串口号;

Size:实际接收的字节长度。

注:该回调函数为空的弱函数,函数主体需自己重新定义。

三、实例

从串口1接收不定长数据,存放在数组array[50]中,并返回所接收的数据。

3.1、定义

定义一维数组array:

uint8_t array[50];                                                    //定义array

3.2、主函数

在主函数的初始化过程,调用函数“HAL_UARTEx_ReceiveToIdle_IT”:

void main()
{
    HAL_UARTEx_ReceiveToIdle_IT(&huart1, array, 50);                 //初始化开启串口接收

    while(1);
}

3.3、重新定义回调函数

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) 
{
    if(huart == &huart1)                                       //判定:串口1接收
    {

        HAL_UART_Transmit_IT(&huart1, array, Size);            //返回接收数据
        HAL_UARTEx_ReceiveToIdle_IT(&huart1, array, 50) ;      //重新开启串口接收         

    }
}

初始化打开串口接收中断,当串口接收满50字节,或串口产生空闲时,会执行回调函数。回调函数里判断串口后正确后,执行对应的功能函数,并再次开启串口接收中断。

经验分享 程序员 微信小程序 职场和发展