• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:DMAを使ったUARTの受信が一度しかできない)

UARTの受信が一度しかできない問題が発生する理由は?

このQ&Aのポイント
  • STM32F3 シリーズにて DMA を利用した UART 通信の受信を行っていますが、最初の 7Byte を正常に受信した後に受信が止まってしまいます。
  • デバッグ情報を確認すると、受信に関連して以下の状態がなっています: - huart1.Lock = HAL_UNLOCKED - huart1.State = HAL_UART_STATE_READY - huart1.ErrorCode = HAL_UART_ERROR_NONE - hdma_usart1_rx.Lock = HAL_UNLOCKED - hdma_usart1_rx.State = HAL_DMA_STATE_READY
  • この問題の原因として考えられるのは、DMA の設定や割り込みの管理が適切に行われていないことです。正常に受信できた後の状態と考えると、DMA が再度有効になっていない可能性があります。また、割り込みが適切に発生していないことも考えられます。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

HAL_UART_Receive_DMA()が繰り返し実行されるようになっていないため,一回しか受信しません。 HAL_UART_Receive_DMA()及びバッファを取り出す処理をwhileループの中もしくは あなたが本来意図している場所に置く必要があるでしょう。 何も考えてないんだとは思いますが。。。 余力があれば: >通信するデータは 7Byte 1Set の固定データで、連続して送信されます。 受信側での取りこぼしを避けるために連続送信させずに,送信側を待たせる方法があります。 「フロー制御」等についても調べてみてください。

zero-spica
質問者

お礼

ご指摘の通り、ループ内に以下のコードを追加したところ、無事に連続受信できました。 if((huart1.State == HAL_UART_STATE_READY) && (hdma_usart1_rx.State == HAL_DMA_STATE_READY)) { HAL_UART_Receive_DMA(&huart1, &USART1_RXD_Buffer[0], USART1_RX_LEN); } 的確なアドバイス、ありがとうございました。

関連するQ&A