打印
[方案相关]

stm32串口热拔插以后,接收数据出错的处理办法

[复制链接]
872|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
最近发现,STM32中断接收完成回调函数在USB转CH340模块带电拔插一次以后会出现异常数据。具体的来说是数据出现一次右移,再出现一次右移,以后每次接受接收到的数据都出现位移。引起这个问题的原因可能是拔掉以后导致STM32串口硬件出错。硬件出错必须要复位才行,那怎么在单片机正常运行的时候怎么判断串口硬件出错呢?

使用特权

评论回复
评论
hehhehee 2022-6-28 22:31 回复TA
———————————————— 版权声明:本文为CSDN博主「朱宇阳」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/weixin_42618564/article/details/108770730 
沙发
hehhehee|  楼主 | 2022-6-28 18:22 | 只看该作者
我在网上找了很多的资料,大多数的都出现在处理数据上。不是和我问题很接近的。然后我想在HAL库的串口.c文件中找问题所在。

使用特权

评论回复
板凳
hehhehee|  楼主 | 2022-6-28 22:18 | 只看该作者
首先,HAL库的串口库stm32f1xx_hal_uart.c中有明确的表示,注意下方红色字体。

使用特权

评论回复
地板
hehhehee|  楼主 | 2022-6-28 22:22 | 只看该作者

使用特权

评论回复
5
hehhehee|  楼主 | 2022-6-28 22:23 | 只看该作者
在官方库的介绍中,有详细的讲解,如何使用这些函数,以及出现问题怎么解决,我们只要花点时间去琢磨他还是可以找到问题的关键的。

使用特权

评论回复
6
hehhehee|  楼主 | 2022-6-28 22:23 | 只看该作者

使用特权

评论回复
7
hehhehee|  楼主 | 2022-6-28 22:27 | 只看该作者
在stm32f1xx_hal_uart.c文件中的这段话大体意思是;

(+)错误被认为是可恢复的和非阻塞的:传输可以一直进行到结束,但是错误的严重性将由用户评估:这涉及到帧错误、奇偶校验错误或中断模式接收中的噪声错误。然后检索接收到的字符并将其存储在Rx缓冲区中,设置错误代码以允许用户识别错误类型,并执行HAL_UART_ErrorCallback()用户回调。传输在UART上继续进行侧面。如果用户想要中止它,中止服务应该由用户调用。

使用特权

评论回复
8
hehhehee|  楼主 | 2022-6-28 22:31 | 只看该作者
(+)错误被视为阻塞:传输无法正确完成,是中止了。这个涉及中断模式接收中的超限错误和DMA中的所有错误模式。错误代码被设置为允许用户识别错误类型,并执行HAL_UART_ErrorCallback()用户回调。

使用特权

评论回复
9
hehhehee|  楼主 | 2022-6-28 22:32 | 只看该作者
出现错误会在HAL_UART_ErrorCallback()函数中处理,这样的话我们在错误回调函数中复位,当检测到硬件错误,就在这里复位。下面添加复位代码:

使用特权

评论回复
10
hehhehee|  楼主 | 2022-6-28 22:34 | 只看该作者
先关闭中断,再软件复位。可以解决问题。

复位是最简单的方案,当然有的朋友说,我还有其他的任务要处理,不能在此处复位。这样的话我们在错误中断回调函数里重新初始化串口好像也行。但是我没有试验。有感兴趣的朋友可以试一试。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

78

主题

943

帖子

0

粉丝