STM32
直播中

fansz

8年用户 1249经验值
擅长:制造/封装
私信 关注
[问答]

HAL_UART_Receive_IT,HAL_UART_Transmit不能正常接收数据的原因?

问题:
我在项目中最初用的是HAL_UART_Receive_IT,HAL_UART_Transmit。每次在接收到数据后会在回调函数里再次调用HAL_UART_Receive_IT。
当高频进行串口数据收发时,发现有概率不能正常接收数据。 问题发生后断电重启后,又恢复正常。

根据各种调查外加查资料,发现主要原因应是 __HAL_LOCK 的直接返回,导致HAL_UART_Receive_IT 失败后不能再开中断。

STM32f103 HAL 库的  串口中断方式接收数据的函数HAL_UART_Receive_IT、发送函数  HAL_UART_Transmit_IT、HAL_UART_Transmit 的内部实现都有   __HAL_LOCK(huart); 根据其实现,若调用时发现已经上锁,则会直接返回

HAL_BUSY。

1.有人建议说使用 HAL_UART_Transmit_IT代替HAL_UART_Transmit,但是我看内部实现都有 __HAL_LOCK(huart),这样一来只是会减小上述问题发生的概率,并未解决问题,因此并未采用。
2.我尝试在原本HAL_UART_Receive_IT的地方都追加了返回值判断,一旦返回  HAL_BUSY,就去主循环每10ms重新调用一次
HAL_UART_Receive_IT,直到返回正确。 但是经过长时间测试,又发生了问题,无法接续正常收发数据了。
3.我尝试在 HAL_UART_Receive_IT的实现里,把__HAL_LOCK(huart) 注释掉,跟2.的设备一起做长时间测试,做对比试验,目前暂未出现问题。  但网上的开发者说并不建议这样粗暴对策,我也暂不明确会有什么副作用,因此目前还在寻找更好的方法。

请问大佬们是否有什么建议? 感激不尽。

回帖(1)

郭中

2024-4-3 16:00:53
可能的原因包括:

1. 数据接收速度过快导致缓冲区溢出:如果接收数据的速度比处理数据的速度快,可能会导致缓冲区溢出,从而导致数据丢失。可以尝试增大接收缓冲区的大小或者更快地处理接收到的数据。

2. 中断优先级设置不正确:如果中断优先级设置不正确,可能会导致中断处理函数得不到正确的执行。确保串口接收和发送的中断优先级设置正确,且不会被其他高优先级中断打断。

3. 错误的时序问题:可能存在时序问题导致数据传输错误。可以尝试添加适当的延时或者调整时钟树以解决时序问题。

4. 电源干扰或传输线干扰:高频的串口数据传输可能会受到电源干扰或传输线干扰的影响,导致数据错误或丢失。可以尝试增强电源滤波和隔离串口传输线以减少干扰。

为了进一步确定具体问题的原因,可以使用调试工具(如串口调试助手)来查看发送和接收的数据是否正确,并使用示波器来观察相关的信号波形,以帮助定位问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分