情况一:
上、下位机通讯使用串口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校验。