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

STM32的串口接收可能出现中断+DMA接收时的ORE错误和BUSY标志位问题,以及阻塞式接收超设定长度导致的ORE错误。解决方法包括清除ORE错误标志,检查并处理BUSY状态,以及确保正确处理接收缓冲区的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

暮梧寒

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值