项目场景:
使用STM32L476最小核心板与4G模块通信
问题描述:
使用了HAL DMA空闲中断的方式与模块通信。测试中发现,串口会时不时的接收数据失败,重新初始化串口,又可以使用了。
这个是串口正常值:
![](https://i-blog.csdnimg.cn/blog_migrate/f11a3d3d27d18f43a16b8ad0c779e57a.png)
这个是串口异常时寄存器的值:
![](https://i-blog.csdnimg.cn/blog_migrate/1250187bfd981ee48531e9cd9a2c0e85.png)
原因分析:
在串口空闲中断中调用了HAL_UART_DMAStop()函数,这个函数使uart接收和发送同时关闭,这样会使串口在有数据过来的时候会出现溢出错误,必须要读取串口缓存值或者重新初始化一次串口才能修复错误。
解决方案:
将HAL_UART_DMAStop()函数替换成HAL_UART_AbortReceive()函数,只关闭接收的函数,问题修复。