stm32+空闲中断+串口DMA传输 通信异常问题:通信中断后连不上
- 在stm32与上位机通信过程中,有的时候会受到干扰导致下位机触发通信异常,然后单片机会自动屏蔽通信接收中断,导致只有通信模块不正常,其他部分正常运行。由于通信异常触发发时间不确定导致每次上位机与stm32通信中断的时间也是不确定的,有的时候几个小时,有的时候几天。所以很难复现。但在上位机下发命令比较快时,触发异常的概率就会变大,在复现异常后,通过单步调试发现,触发通信异常时会调用一个通信异常回调函数,可以在这个回调函数中重新初始化通信模块,重新建立通信。
//----------------------------------USART 异常 回调函数----------------------------
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
__HAL_UART_CLEAR_OREFLAG(&huart1);
USART1_error_flag = 1;//USART 异常初始化标志位
}
}
/*主函数*/
//USART 通信异常初始化
if(USART1_error_flag == 1)
{
USART1_TX_L(); //设置为接收状态
__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
HAL_UARTEx_ReceiveToIdle_DMA(&huart1,Usart1.Usart_DMAReceiveCache,Usart1_ReceiveLength);
memset(Usart1.Usart_ReportCache,0,Usart1_ReportLength);
USART1_error_flag = 0;
}