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

目录

一、简介

1.1、开发环境

1.2、实现功能

二、步骤解析

2.1、配置串口

2.2、初始化

2.3、回调函数

三、示例

3.1、定义

3.2、主函数

3.3、重新定义回调函数

四、补充DMA方式

4.1、配置DMA

4.2、串口接收函数


一、简介

1.1、开发环境

IED软件:STM32CubeIDE V1.9。

单片机型号:STM32F103。

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字节,或串口产生空闲时,会执行回调函数。回调函数里判断串口后正确后,执行对应的功能函数,并再次开启串口接收中断。

四、补充DMA方式

上述为中断配置和使用方式,它和DMA方式的主要区别:使用中断方式,串口每接收一个字节,需要进入串口中断,将串口接收寄存器的数据转存到数组中,会占用单片机资源;使用DMA方式,串口每接收一个字节,都是通过DMA将串口接收寄存器的数据转存到数组中,无需占用CPU资源。

4.1、配置DMA

在2.1的基础上,在“DMA Settings”栏目,通过按钮“Add”增加串口收发DMA。

4.2、串口接收函数

使用函数“HAL_UARTEx_ReceiveToIdle_DMA”替换“HAL_UARTEx_ReceiveToIdle_IT”。

使用函数“HAL_UART_Transmit_DMA”替换“HAL_UART_Transmit_IT”。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洪恒远

感君意气无所惜,一为歌行歌主客

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值