STM32
直播中

蒲泛粟

7年用户 954经验值
私信 关注
[问答]

请问stm32串口热拔插以后接收数据出错怎么解决?

怎么在单片机正常运行的时候判断串口硬件是否出错?
STM32串口热拔插以后接收数据出错怎么解决?

回帖(1)

韩冬

2021-12-9 11:02:16
最近发现,STM32中断接收完成回调函数在USB转CH340模块带电拔插一次以后会出现异常数据。具体的来说是数据出现一次右移,再出现一次右移,以后每次接受接收到的数据都出现位移。引起这个问题的原因可能是拔掉以后导致STM32串口硬件出错。硬件出错必须要复位才行,那怎么在单片机正常运行的时候怎么判断串口硬件出错呢?
  我在网上找了很多的资料,大多数的都出现在处理数据上。不是和我问题很接近的。然后我想在HAL库的串口.c文件中找问题所在。
  首先,HAL库的串口库stm32f1xx_hal_uart.c中有明确的表示,注意下方红色字体。
  
  
  

  在官方库的介绍中,有详细的讲解,如何使用这些函数,以及出现问题怎么解决,我们只要花点时间去琢磨他还是可以找到问题的关键的。
  
  
  

  在stm32f1xx_hal_uart.c文件中的这段话大体意思是;
  (+)错误被认为是可恢复的和非阻塞的:传输可以一直进行到结束,但是错误的严重性将由用户评估:这涉及到帧错误、奇偶校验错误或中断模式接收中的噪声错误。然后检索接收到的字符并将其存储在Rx缓冲区中,设置错误代码以允许用户识别错误类型,并执行HAL_UART_ErrorCallback()用户回调。传输在UART上继续进行侧面。如果用户想要中止它,中止服务应该由用户调用。
  (+)错误被视为阻塞:传输无法正确完成,是中止了。这个涉及中断模式接收中的超限错误和DMA中的所有错误模式。错误代码被设置为允许用户识别错误类型,并执行HAL_UART_ErrorCallback()用户回调。
  出现错误会在HAL_UART_ErrorCallback()函数中处理,这样的话我们在错误回调函数中复位,当检测到硬件错误,就在这里复位。下面添加复位代码:
   
  
  
  

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

更多回帖

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