La interrupción USART no funciona como se esperaba [STM32 Nucleo]

1

¿alguien podría explicar por qué solo puedo recibir 13 caracteres con la interrupción de USART? Uso '\ n' para detectar el final de la cadena.

#defineBUFFER_SIZE100charreceive_buffer[BUFFER_SIZE];charreceive_data;intreceive_index=NULL;intdata_ready_index=NULL;voidUSART2_receive(voidconst*argument){for(;;){if(data_ready_index==1){HAL_UART_Transmit_IT(&huart2,(uint8_t*)"Received data: ", strlen("Received data: "));
                HAL_Delay(50);
                HAL_UART_Transmit_IT(&huart2, (uint8_t *)receive_buffer, strlen(receive_buffer));
                memset(receive_buffer, NULL, sizeof(receive_buffer));
                HAL_Delay(50);
                HAL_UART_Transmit_IT(&huart2, (uint8_t *)"\r\n", strlen("\r\n"));
                data_ready_index = NULL;
                }
         }
     }

    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {

        if (huart->Instance == USART2){
            if (receive_data != 13){
                receive_buffer[receive_index++]=receive_data;
            }else{
                    receive_index = NULL;
                    data_ready_index = 1;                                                               
                    // Received data ready to be processed
            }
      }
    }

    void USART2_IRQHandler(void){

      HAL_UART_IRQHandler(&huart2);
      HAL_UART_Receive_IT(&huart2, (uint8_t *) &receive_data, 1);
    }
    
pregunta Into_Embedded

2 respuestas

2

Encontré el problema. En la función void USART2_receive (void const * argumento) i aumentó la demora de 50 a 100 y luego todo funciona bien. Como mencionó @MITURAJ, esto puede deberse a un desbordamiento del búfer.

void USART2_receive(void const * argument){
    for(;;){
        if(data_ready_index == 1){
            HAL_UART_Transmit_IT(&huart2, (uint8_t *)"Received data: ", 
            strlen("Received data: "));
            HAL_Delay(100);
            HAL_UART_Transmit_IT(&huart2, (uint8_t *)receive_buffer, 
            strlen(receive_buffer));
            HAL_Delay(100);
            HAL_UART_Transmit_IT(&huart2, (uint8_t *)"\r\n", strlen("\r\n"));
            data_ready_index = NULL;
            memset(receive_buffer, NULL, sizeof(receive_buffer));
        }
    }
}
    
respondido por el Into_Embedded
2

Encontrar que necesita un retraso más prolongado debería avisarle que no está esperando a que la Tx termine realmente. HAL_UART_Transmit_IT utiliza una interrupción para enviar bytes (no es de bloqueo). Básicamente, le está diciendo que transmita, que espere un poco, y vuelva a meter datos en el búfer antes de que se realice la transmisión.

En su lugar, le sugiero que supervise la devolución de llamada a HAL_UART_TxCpltCallback y una vez que eso suceda, establezca un indicador. En su función USART2_receive, espere a que se establezca la bandera antes de pedirle que envíe las cosas nuevamente. Recuerde borrar la bandera antes de esperar a que se vuelva a configurar :)

    
respondido por el Catsunami

Lea otras preguntas en las etiquetas