¿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.
#define BUFFER_SIZE 100
char receive_buffer[BUFFER_SIZE];
char receive_data;
int receive_index = NULL;
int data_ready_index = NULL;
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(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);
}
Encontré el problema. En la función void USART2_receive (void const * argument) aumenté el retraso 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));
}
}
}
Descubrir que necesita un retraso más prolongado debería indicarle que no está esperando a que finalice el Tx. HAL_UART_Transmit_IT usa una interrupción para enviar bytes (no es bloqueante). Básicamente, le está diciendo que transmita, espere un poco y vuelva a meter datos en el búfer antes de que finalice 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 algún indicador. En su función USART2_receive, espere a que se establezca la bandera antes de pedirle que envíe cosas nuevamente. Recuerde borrar la bandera antes de esperar a que se establezca nuevamente :)
Trevor_G
Arsenal
\n
pero tu código está verificando\r
cuál es 13 y solo procesas 13 bytes, pero entonces, ¿por qué estástrlen
dando más de 13 y envía algunos 0x00 bytes con ellos (<0>)? El mensaje que recibes es la longitud del mensaje transmitido, solo el contenido de los últimos 3 bytes es incorrecto.Into_Embedded
Trevor_G
Into_Embedded
Trevor_G
Into_Embedded
Trevor_G
mitu raj
Into_Embedded
mitu raj
Into_Embedded
mitu raj
Into_Embedded
mitu raj
mitu raj
mitu raj
Into_Embedded