Estoy tratando de implementar la validación de entrada en el lado STM32. Espero permitir una cadena en la forma "x \ n" donde "x" puede ser cualquier carácter.
Para recibir un número cambiante de bytes, lo he implementado en USART1_IRQHandler
void USART1_IRQHandler(void)
{
if((USART1->ISR & USART_ISR_RXNE) != RESET) {
if((1+RX_BUFFER_POS) < RX_BUFFER_SIZE) {
UART_Buffer[1+RX_BUFFER_POS++] = USART1->RDR; // reading from DR resets RXNE flag, no need to manually clear it!
}
}
HAL_UART_IRQHandler(&huart1);
}
Y en el bucle main while del programa
if((RX_BUFFER_POS + 1) >= 2) {
if(UART_Buffer[1] == 0x0A && !(UART_Buffer[2])) {
HAL_UART_Transmit_IT(&huart1, (uint8_t*)OK_BUFFER, OKBUFFERSIZE);
} else {
UART_Buffer[2] = 0;
RX_BUFFER_POS = -1;
HAL_UART_Transmit_IT(&huart1, (uint8_t*)BAD_BUFFER, BADBUFFERSIZE);
}
RX_BUFFER_POS = -1;
}
El código rechaza correctamente una cadena de caracteres no válida, uso "00 \ n" como ejemplo, la primera vez. Después de eso, se rechazan todas las cadenas, incluida una cadena "válida" ("x \ n").
Hice algo de depuración y descubrí que después de una cadena incorrecta, RX_BUFFER_POS
no se estaba restableciendo en -1, sino que se atascó en 0. ¿Cuál es la causa de esto? También descubrí que si añadía un retraso de 1 ms al bucle while principal, el problema se solucionó. Esto me hace sospechar que está ocurriendo algún tipo de condición de carrera.
Una nota al margen, encontré una manera de corregir cualquier carácter rechazado. Si envío una cadena de longitud 7, siendo "\ n" el último carácter, el rechazo funcionará una vez más. Cuando envío la cadena, recibo "BAD" y también "OK".
Mi pregunta es ¿por qué RX_BUFF_POS no se restablece a -1 cuando se recibe una cadena incorrecta? Además, como parece que se está produciendo una condición de carrera, ¿cómo puedo rastrear la causa de esto?