Вы получаете байт и заносите его в регистр TDR
вашего UART. Вероятно, он работает с той же скоростью передачи данных, поэтому до завершения передачи получено новое прерывание приема. Вызов HAL_UART_Transmit
блокируется и проверяет, выполняется ли передача. Оператор if(huart->gState == HAL_UART_STATE_READY)
вернет false
и, таким образом, займет путь else
. Это приведет к возвращаемому значению HAL_BUSY
. Что указывает на то, что ни одна передача не произошла, потому что она все еще продолжалась.
Вам нужно будет добавить кольцевой буфер, чтобы это исправить. Сохраните полученный байт в контейнере хранения из вашего обработчика прерываний, и другая часть вашей программы должна проверить, не является ли контейнер хранения пустым, и передать содержимое, если оно не пусто. Вам нужно будет отключить прерывания при обновлении контейнера хранения, потому что может возникнуть состояние гонки.
Вы также можете добавить к концу передачи символ окончания передачи, указывающий на то, что безопасно возвращать его вам, и, таким образом, избегая состояния гонки. 0x04
отличный выбор для этого, если вы используете ASCII, потому что он определен как EOT
(конец передачи).
Другой вариант - использовать HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
для получения установленного количества байтов в режиме прерывания.
Код библиотеки для UART находится внутри: stm32f4xx_hal_uart.c
. HAL для STM довольно читабелен и информативен, не стесняйтесь заглядывать внутрь. Это может помочь в будущем найти другие ошибки. (ST не всегда делает очевидный или совместный выбор в своем коде)