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

刚装了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函数了,如下:

/**
  * @
  • 21
    点赞
  • 176
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: STM32F HAL是STMicroelectronics公司提供的一种硬件抽象层,用于简化STM32F系列微控制器的编程。对于串口数据的问题,有以下几种可能的原因和解决方法。 1. 波特率设置不正确:串口通信需要设置正确的波特率,发送和接收端的波特率必须一致。如果波特率设置错误,会导致数据传输出现错误和失。解决方法是在使用HAL进行串口配置时,确保设置正确的波特率参数。 2. 数据接收缓冲区溢出:如果接收缓冲区大小不足以容纳接收到的数据,会导致数据失。解决方法是增加接收缓冲区的大小,确保能够容纳所需的数据量。 3. 中断优先级设置错误:如果中断优先级设置不正确,会导致数据失。解决方法是在使用HAL时,正确设置中断优先级,确保串口中断可以正常响应和处理数据。 4. 数据发送过快:如果程序在发送数据时速度过快,接收端可能来不及接收全部数据,导致失一部分数据。解决方法是控制发送数据的速度,确保接收端能够及时接收并处理数据。 5. 硬件故障:如果串口硬件出现故障,比如引脚接触不良或者电路异常,也会导致数据失。解决方法是检查硬件连接和电路,确保没有故障。 总之,解决STM32F HAL串口数据的问题需要仔细检查串口相关的配置参数、中断优先级、缓冲区大小以及硬件连接等方面的设置,确保它们都正确无误。此外,对于数据发送和接收速度的控制也很重要,确保发送端和接收端可以有足够的时间来进行数据的传输和处理。 ### 回答2: STM32F HAL串口数据的问题,可能是由于以下几个方面引起的: 1. 数据发送速度过快:当发送速度超过接收方处理数据的速度时,会导致数据失。可以尝试降低发送速度,增加发送数据的间隔时间,或者使用流控制技术,如硬件流控制或软件流控制,来实现数据的稳定传输。 2. 中断优先级设置错误:中断优先级设置不当会导致串口接收中断被其他高优先级的中断打断,从而导致数据失。应该根据系统的需求合理设置中断优先级。 3. 缓冲区溢出:串口接收数据的缓冲区有限,如果接收的数据量超过了缓冲区的容量,会导致数据失。可以通过增大缓冲区的大小来解决此问题。 4. 错误的数据处理方式:如果数据接收方没有正确处理串口接收数据的过程,比如没有正确判断数据的起始和结束标志,或者没有正确解析数据内容,都可能导致数据失。应该对接收到的数据进行正确的处理和解析。 5. 硬件问题:串口传输数据时,硬件的稳定性也会影响数据的完整性。如果出现硬件故障或者连接问题,也可能导致数据失。 要解决串口数据的问题,需要对以上几个方面进行逐一排查和调试,找出问题所在并针对性地进行修复。另外,确保系统的时钟配置正确,并根据实际需求选择合适的波特率、数据位、校验位和停止位等参数,也是保证数据传输稳定的重要步骤。 ### 回答3: STM32F HAL是STMicroelectronics推出的一套供STM32系列芯片使用的硬件抽象层。在使用HAL进行串口通信时,有时会出现数据失的情况。出现数据失的原因可能有以下几点: 1.串口波特率设置不正确:串口通信时,发送方和接收方必须使用相同的波特率进行通信。如果发送方和接收方的波特率不一致,就会导致数据失。 2.缓冲区溢出:当串口数据发送速度过快,超过了接收方的处理能力时,会导致数据失。这种情况可以通过增大接收方的接收缓冲区大小来解决。 3.中断优先级不正确:在HAL中,串口通信是通过中断来处理的。如果串口中断的优先级设置不正确,可能会出现数据失的情况。一般来说,串口中断的优先级应该设置为比其他中断(如定时器中断)的优先级低。 4.程序处理速度过慢:如果主程序的处理速度较慢,无法及时处理串口接收的数据,就会导致数据失。可以通过优化程序逻辑,提高程序处理速度来解决。 为了解决串口数据失的问题,可以采取以下几个措施: 1.确保发送方和接收方的波特率设置一致,以保证数据的正确传输。 2.增加接收方的接收缓冲区大小,以应对快速的数据传输。 3.正确设置串口中断的优先级,避免与其他中断冲突。 4.优化程序逻辑,提高程序处理速度,以确保及时处理串口接收的数据。 综上所述,通过正确设置波特率、增加缓冲区大小、正确设置中断优先级和优化程序逻辑,可以有效解决STM32F HAL串口数据的问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值