5

stm32f0 MCU を使用しています。

受信したすべてのバイトが送信される単純な UART エコー コードがあります。動作することをテストしました。ここにあります;

uint8_t Rx_data[5]; 
uint32_t tx_timeout = 0;
//Interrupt callback routine
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart->Instance == USART1)  //current UART
    {
        HAL_UART_Transmit(&huart1, &Rx_data[0], 1, tx_timeout);        
        HAL_UART_Receive_IT(&huart1, Rx_data, 1);   //activate UART receive interrupt every time on receiving 1 byte
    }
}

コードは機能しますが、快適ではありません。まず、tx_timeoutは 0 であり、ほとんどのコード例は非ゼロです。副作用はわかりません。次に、HAL_UART_Transmit()ブロッキング呼び出しであり、割り込み内でブロッキング呼び出しを使用することはお勧めできません。HAL_UART_Transmit_IT()そこで、ブロッキング呼び出しの代わりにUART 送信に割り込みを使用することにしました。変更されたコードは次のとおりです。

uint8_t Rx_data[5]; 
uint32_t tx_timeout = 0;
//Interrupt callback routine
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart->Instance == USART1)  //current UART
    {
        HAL_UART_Transmit_IT(&huart1, &Rx_data[0], 1);        
        HAL_UART_Receive_IT(&huart1, Rx_data, 1);   //activate UART receive interrupt every time on receiving 1 byte
    }
}

ただし、期待どおりに動作しません。私の PC は ASCII 12345678 を stm32 に送信します。期待どおりに動作する場合、PC は 12345678 を受信して​​いるはずです。ただし、PC は代わりに 1357 を受け取ります。を使用するこのコードの何が問題になっていますHAL_UART_Transmit_IT()か?

4

1 に答える 1