STM32 HAL串口接收常用的几种方式

通常我们在设计串口协议的时候会有几种规格:
一、包头+长度+数据+校验位+包尾
二、数据+\r\n
三、数据

对于第一、第二种处理起来非常容易,直接采用串口接收中断即可,如果觉得效率不够高,那么就让串口接收中断+DMA的方式来处理,给CPU减负。
之前也写过类似的文章:
stm32f429 HAL库处理串口接收–如何接收带\r\n的串口数据

对于第三种,也就是不带包头、包尾的,只有数据,这种我们之前没有介绍过,在我看来它的设计有些不太合理,但在数据量不大的情况下,确实也可以这么做,STM32 HAL提供了串口空闲中断+DMA的方式来处理,在数据量较大且容易出错的情况下,建议还是采用自定义协议的方式去处理。

空闲中断+DMA具体实现思路如下:
1、在初始化的时候即开启DMA接收

__HAL_UART_ENABLE_IT(&huart5, UART_IT_IDLE);

2、在中断服务函数中判断空闲中断标志,一旦触发了空闲中断标志,此时表示数据已经接收完成了,这时候要关DMA接收,等到下一次我们需要接收的时候再开启接收即可。

//停止DMA接收
HAL_UART_DMAStop(&huart5);
//开启DMA接收
HAL_UART_Receive_DMA(&huart5, (uint8_t*)USART5_RX_BUF, USART_REC_LEN);

处理空闲中断服务函数:

void UART5_IRQHandler(void)
{
    /* USER CODE BEGIN UART5_IRQn 0 */
    //开启uart5空闲中断接收
    if(RESET != __HAL_UART_GET_FLAG(&huart5, UART_FLAG_IDLE))
    {
        __HAL_UART_CLEAR_IDLEFLAG(&huart5);
        HAL_UART_DMAStop(&huart5);
    }
}

如上代码示例,当我们开启了DMA接收,当触发了空闲中断以后,我们就可以将USART5_RX_BUF这里面的数据取出来,如果要继续接收,那就再重新开启DMA接收即可。

发布了597 篇原创文章 · 获赞 1061 · 访问量 182万+

猜你喜欢

转载自blog.csdn.net/morixinguan/article/details/103474643