STM32 之 HAL 库串口 USART 丢数据及ORE卡死的解决方案

在STM32串口通信中遇到接收数据时卡死和ORE(Overrun Error)问题。关闭ORE检测能避免卡死,但可能导致数据丢失。通过调试HAL_UART_Receive函数,发现超时设置可能导致错误状态,修改超时处理后,成功解决了数据丢包和卡死问题。

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

刚装了VS2019Preview,VS2017系列应该还有最后一章就结束了,找个时间结束掉它。

昨晚弄了下STM32的串口通信,发现UART在接收PC串口调试助手发送的数据的时候,会时不时卡死,不能接收新的数据。之前公司有人做这方面的项目的时候也是这个情况,当时发现UART处于ORE(overrun error)状态,归结为波特率太高,降低波特率算妥协了。结果自己弄Nucleo的开发板也出现这个情况,我想STM官方开发板应该不至于只能跑低速通信。没办法查查吧。

首先把ORE的检测关掉。这个东西吧,有啥意义呢?Overrun检测是好的,可以告诉系统目前通信超负荷然后进行调整。但是目前99%以上的开发者都不会管这个东西,另外他们也没有这么极限数据率通信的需求。如果要检测ORE,你的系统中一定要有UART的Error handler 函数,进行ORE出现时的状态寄存器清理和系统调整。否则就会出现系统被卡死再也无法通信的情况。

这个ORE的检测是CubeMX默认打开的,在UART的配置里面,如下(我这是5.0CubeMX):

代码里面是这两句(我的CubeMX和MDK都是最新版,可能老版本不一样,如果没有就写ErrorHandler进行错误位复位):

  huart2.AdvancedInit.OverrunDisable = UART_ADVFEATURE_OVERRUN_DISABLE;
  huart2.AdvancedInit.DMADisableonRxError = UART_ADVFEATURE_DMA_DISABLEONRXERROR;

---------------------------------------------------------2019/6/25 更新--------------------------------------------------------------------

试了下STM32F103RC并没有这个OverrunDisable开关,之前还认为是CubeMX更新后带来的新特性。

如果没有的话那就需要自己写ErrorCallback函数了,如下:

/**
  * @
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值