使用STM32串口时遇到的“串口死机”问题解决记录

项目中使用STM32F4通过HAL库处理串口通信时遇到串口接收溢出问题。解决方法包括清除OverrunError标志、重启DMA接收以及在错误回调中重新初始化串口和DMA。博主‘天堂陌客’的方法最终解决了问题,确保了后续数据接收的连续性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      些日子的一个项目,采集几路PT100温度及几路电流电压并通过modbus rtu 送给上位机,CPU采用了STM32F4,在现场测试时发现,运行一段时间会出现串口不再回应上位机的读取命令,停电重起后恢复正常通讯,看起来像STM32系统死机了,运行一段时间后又重复该现象。

     该STM32系统使用了HAL库,由STM32CUBEMX生成了基础工程,采用串口空闲中断,DMA传输。 项目初步完成后也长时间测试,开始测试时用modbuspoll每1S读一次,未发现该问题。

      现场测试时,上位机读取包括该STM32系统在内的多个从机设备,每200ms读取一次,就会出现串口“”死机“”现象。网上查询了很多遇到相似问题的文章,该现象为串口接收溢出,Overrun Error标志置位,测试后发现上位机读取的越频繁,该现象出现的越快。

     看到很多解决方案是重写串口错误回调函数HAL_UART_ErrorCallback (),在里面清除USART_SR寄存器的ORE(溢出错误标志)并重新起动DMA接收即可。于是依法清除ORE标志,重新启动DMA接收,但是没有解决问题,故障依然出现。调试发现一旦出现溢出错误再收到数据后即进入错误回调函数,不再正常接收数据,清除错误标志也不行。折腾好久终于意识到DMA状态也需要重新设置。

     于是参考了博主“”天堂陌客“”的办法,在错误回调函数重新初始化串口及DMA,添加了如下代码:

                      

          memset(&huart3,0,sizeof(UART_HandleTypeDef) );

          memset(&hdma_usart3_rx,0,sizeof(DMA_HandleTypeDef) );

          memset(&hdma_usart3_tx,0,sizeof(DMA_HandleTypeDef) );  

          HAL_UART_MspDeInit(&huart3);

          MX_DMA_Init();

          MX_USART3_UART_Init();

 问题得以解决,在出现溢出错误后只影响当时的数据,不影响以后的数据接收。

非常感谢愿意分享遇到问题的各位博主!

         

     

   

   

STM32串口通信实验中,可能会遇到以下问题: 1. 无法发送或接收数据 如果无法发送或接收数据,可能是因为串口参数配置不正确或者硬件连接有误。需要确认以下几点: - 确认串口参数配置正确,包括波特率、数据位、停止位、奇偶校验等参数 - 确认串口钟已经使能 - 确认串口的硬件连接正确,包括串口接口、连接线和外部设备等 2. 数据传输不稳定或出现乱码 如果数据传输不稳定或出现乱码,可能是因为串口传输速率不匹配或者中断服务函数执行间过长导致的。需要确认以下几点: - 确认串口传输速率匹配,包括外部设备的传输速率和程序中的串口参数配置 - 确认中断服务函数执行间尽可能短,避免长间占用CPU资源导致数据传输不稳定或出现乱码 解决方法: 在使用STM32串口通信,可以采用以下步骤进行配置和编程: 1. 配置串口参数 使用USART_Init函数对串口进行配置,设置相应的波特率、数据位、停止位、奇偶校验等参数。 2. 编写中断服务函数 根据需要编写中断服务函数,并在函数中进行相应的处理。需要注意的是,中断服务函数应该尽可能的简单,避免长间占用CPU资源,否则可能会影响其他重要任务的执行。 3. 开启串口中断 在程序中开启串口中断,使得程序能够响应串口数据传输事件。 4. 烧录程序 将程序烧录到STM32芯片中,通过串口发送和接收数据,观察数据传输情况和中断服务函数的执行情况。 需要注意的是,在编写程序需要遵循一些规范和最佳实践,如使用宏定义等方法来定义常量和变量,避免使用硬编码方式;使用防抖和消抖技术来避免串口信号引起的误触发等。同,建议使用示波器等工具来观察数据传输情况和中断服务函数的执行情况,以便进行调试和优化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值