需求

串口使用普通的接收中断 HAL_UART_Receive_IT 在接收比较少的字节,并且中断处理非常简单的情况下还行,一旦需要接收大量的数据,并且中断处理稍微复杂一些,就会造成丢数据的情况。需要解决这个情况。

解决

解决的办法就是使用帧空闲中断 HAL_UARTEx_ReceiveToIdle_IT 来接收一大堆数据,配套的 callback 函数是 HAL_UARTEx_RxEventCallback.

void MainInit()
{
      HAL_UARTEx_ReceiveToIdle_IT(&huart2, uart_web.get_rx_buf(), UartWeb::kRxBufLength);
}

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
      if (huart->Instance == USART2) {
	      LOGD("HAL_UARTEx_RxEventCallback: USART2");
	      if (uart_web.Receive(Size)) {
		      main_status = kMainWebReceive;
	      }
	      //HAL_UART_Receive_IT(&huart2, &uart_web_tmp, 1);
	      HAL_UARTEx_ReceiveToIdle_IT(&huart2, uart_web.get_rx_buf(), UartWeb::kRxBufLength);
      }
}

参考

stm32 HAL库 笔记——HAL_UARTEx_ReceiveToIdle_IT

STM32 非阻塞HAL_UART_Receive_IT解析与实际应用

【STM32】HAL库 STM32CubeMX教程四—UART串口通信详解

STM32CubeMX——串口数据收发基础(HAL 库)