Проблема с получением Uart в состоянии ожидания STM32

#stm32 #uart #dma

Вопрос:

Я использую Uart1 для последовательной записи функции. И я хочу использовать этот интерфейс uart1 для получения данных неизвестной длины. Если я не использую функцию последовательной записи, я получаю данные правильно (с проверкой простоя СТРОКИ и подсчетом размера буфера DMA).

Но если я использую функцию последовательной записи, строка не может простаивать в нужное время, если я хочу печатать, получение данных с uartIdleStateActive2 флагом последовательной записи всегда ВКЛЮЧЕНО

Как я могу использовать этот if((__HAL_UART_GET_FLAG(amp;huart1, UART_FLAG_IDLE) != RESET)) случай, только получить процесс.

Я использую, как те if((__HAL_UART_GET_FLAG(amp;huart1, UART_FLAG_IDLE) != RESET) amp;amp; (__HAL_UART_GET_FLAG(amp;huart1, UART_FLAG_TC) != SET)) , но это не сработало. Как я могу проверить его, чтобы посмотреть состояние простоя во время приема?

 void USART1_IRQHandler(void) {  /* USER CODE BEGIN USART2_IRQn 0 */  /* UART IDLE Interrupt */ // SerialPrint("a");  if((__HAL_UART_GET_FLAG(amp;huart1, UART_FLAG_IDLE) != RESET))   {   HAL_UART_DMAStop(amp;huart1);  DMA_CounterCounted2 = __HAL_DMA_GET_COUNTER(huart1.hdmarx);   if(((DMA_CounterCounted2) lt;= DMA_BUF_SIZE) amp;amp; (DMA_CounterCounted2 != 0))  {  uartIdleStateActive2 = (_Bool)ENABLE;  // SerialPrint("X");  }    __HAL_UART_CLEAR_IDLEFLAG(amp;huart1);  }     /* USER CODE END USART2_IRQn 0 */  HAL_UART_IRQHandler(amp;huart1);  /* USER CODE BEGIN USART2_IRQn 1 */   /* USER CODE END USART2_IRQn 1 */ }  

Конфигурации UART 1:

 static void MX_USART1_UART_Init(void) {   /* USER CODE BEGIN USART1_Init 0 */   /* USER CODE END USART1_Init 0 */   /* USER CODE BEGIN USART1_Init 1 */   /* USER CODE END USART1_Init 1 */  huart1.Instance = USART1;  huart1.Init.BaudRate = 230400U;  huart1.Init.WordLength = UART_WORDLENGTH_8B;  huart1.Init.StopBits = UART_STOPBITS_1;  huart1.Init.Parity = UART_PARITY_NONE;  huart1.Init.Mode = UART_MODE_TX_RX;  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;  huart1.Init.OverSampling = UART_OVERSAMPLING_16;  if (HAL_UART_Init(amp;huart1) != HAL_OK)  {  Error_Handler();  }  /* USER CODE BEGIN USART1_Init 2 */  __HAL_UART_ENABLE_IT(amp;huart1, UART_IT_IDLE); // __HAL_UART_ENABLE_IT(amp;huart1, UART_IT_RXNE);   /* USER CODE END USART1_Init 2 */  }  

Комментарии:

1. Есть флаг прерывания для простоя, у вас он включен? __HAL_UART_ENABLE_IT(amp;huart1, UART_IT_IDLE)

2. Да, я включил. Когда я использую функцию последовательной записи для получения значения записи; флаг uartIdleStateActive2 всегда включен, я не знаю, почему ?

3. Я также добавил конфигурации Uart1