stm32+空闲中断+串口DMA传输 通信异常问题:通信中断后连不上

  1. 在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;
  }

更多推荐