Pourquoi ne UART interruption de transmission ne fonctionnent pas dans ce cas?

Je suis en utilisant stm32f0 MCU.

J'ai un UART simple écho de code dans lequel tous les octets reçus seront transmis. J'ai testé que cela fonctionne. Il est ici;

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

Je ne me sens pas à l'aise avec le code, même si elle fonctionne. Tout d'abord, tx_timeout est 0 et la plupart des exemples de code sont non nuls. Je ne sais pas l'effet secondaire. Deuxièmement, HAL_UART_Transmit() est un appel bloquant et il n'est pas conseillé d'utiliser les appels de blocage à l'intérieur d'une interruption. Donc, j'ai décidé d'utiliser une interruption pour uart transmission HAL_UART_Transmit_IT()au lieu d'un appel bloquant. Voici le code modifié;

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

Toutefois, il ne fonctionne pas comme prévu. Mon PC transmet ASCII 12345678 pour stm32. Si les choses fonctionnent comme prévu, le PC devrait recevoir 12345678 dos. Cependant, le PC reçoit 1357 à la place. Quel est le problème avec ce code qui utilise HAL_UART_Transmit_IT()?

OriginalL'auteur user781486 | 2016-05-20