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

  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值