STM32 HAL库串口突然不再接收数据的异常情况

STM32串口接收分为阻塞式接收和中断式接收。

1、中断+DMA接收

出现突然不再接收数据的异常情况,最有可能的情况为ORE错误和BUSY标志位持续置高。

解决方法:在重新打开中断接收前,使用__HAL_UART_CLEAR_OREFLAG(huart);函数清除ORE错误;如果串口中断重新接收打开频繁且间隔短的话,有可能会出现BUSY标志位持续置高的情况,此时在重新打开中断接收前,需要先判断串口状态是否为HAL_BUSY,再判断是否能重新打开。

2、阻塞式接收

阻塞式接收为定长字节字节数,阻塞式接收突然不再接收数据的异常情况,大多数都是因为实际接收的字节超过了设定接收的字节长度,此时会导致ORE错误,且ORE错误一旦出现,后续的串口数据就不会再写入到缓存中。

解决方法:HAL_UART_Receive();函数没有清除ORE错误的功能,只要在调用这个函数前使用__HAL_UART_CLEAR_OREFLAG(huart);函数清除ORE错误。同时还要取出当前串口缓存中的数据,否则会有一个字节的数据停留在串口接收缓冲区中,导致这个字节数据成为下一帧的帧头,且下一帧字节数又会不正常,再次触发ORE错误。

代码如下:

//判断是否触发了ORE错误
    if(__HAL_UART_GET_FLAG(&huart, UART_CLEAR_OREF) != RESET)
    {
        //取出串口缓存中多余的字节数
        uint8_t data = (uint8_t)(huart.Instance->RDR);
        //清除ORE错误
        __HAL_UART_CLEAR_FLAG(&huart, UART_CLEAR_OREF);
    }

你可能感兴趣的:(STM32学习,stm32,单片机,嵌入式硬件)