電子書籍の厳選無料作品が豊富!

STM32F3 シリーズにて DMA を利用した UART 通信の受信を行ってます。
通信するデータは 7Byte 1Set の固定データで、連続して送信されます。

デバッグを開始して最初の 7Byte は受信できるのですが、それきり受信が止まってしまいます。
何か考えられる原因はありますか?



該当すると思われる箇所のコードを以下にピックアップします。


UART_HandleTypeDef huart1;
DMA_HandleTypeDef hdma_usart1_rx;

#define USART1_RX_LEN 7
uint8_t USART1_RXD_Buffer[USART1_RX_LEN];

int main(void)
{
HAL_Init();

SystemClock_Config();

HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_1);
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 1);

MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();

HAL_UART_Receive_DMA(&huart1, &USART1_RXD_Buffer[0], USART1_RX_LEN);

while (1)
{
}
}


ちなみに、最初に 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
となってます。
(この状態で受信も受信による割り込みも発生しない状態になってしまいます。)

A 回答 (1件)

HAL_UART_Receive_DMA()が繰り返し実行されるようになっていないため,一回しか受信しません。



HAL_UART_Receive_DMA()及びバッファを取り出す処理をwhileループの中もしくは
あなたが本来意図している場所に置く必要があるでしょう。
何も考えてないんだとは思いますが。。。



余力があれば:
>通信するデータは 7Byte 1Set の固定データで、連続して送信されます。
受信側での取りこぼしを避けるために連続送信させずに,送信側を待たせる方法があります。
「フロー制御」等についても調べてみてください。
    • good
    • 0
この回答へのお礼

ご指摘の通り、ループ内に以下のコードを追加したところ、無事に連続受信できました。

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);
}

的確なアドバイス、ありがとうございました。

お礼日時:2014/11/10 08:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!