STM32F103使用串口DMA收发时进入帧错误中断跑飞

情况一:
上、下位机通讯使用串口1DMA收发,由于硬件原因,上位机发来的第一帧数据错误,导致下位机在接收到错误数据时进入帧错误中断,然后下位机就死机了。
解决办法:在进入帧错误中断时,再进行一次串口1初始化、DMA初始化。
这部分代码在在这里插入图片描述

情况二主机和从机通讯使用串口2DMA收发,由于通讯线在热插拔时会产生不稳定电平,导致串口2DMA收发帧错误。然后主机程序就跑飞了。
问题分析:仿真发现,程序进入HardFault_Handler。通过在HardFault_Handler处打断点,Keil菜单栏点击view→Call Stack Window →弹出“Call Stack + Locals”对话框。然后在对话框中右键点击HardFault_Handler选择“Show Caller Code”,就会跳转到出错之前的函数处。
发现指示“for(i = 0; i < len; i++)"错误,经过查其他部分代码,发现CRC16函数在调用时,输入参数len可能为负值。因为热插拔时的不稳定数据可能只有一位,而我要求接收的数据至少3位,因此在进行计算CRC传参len时出现负数,导致进入HardFault_Handler。在这里插入图片描述
解决办法:进入串口帧错误中断时,首先清空DMA接收缓存。同时接收数据长度不够3字节时,不进行CRC校验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值