STM32F04xx UART - Implementar rechazo de entrada para cadenas de más de 2 bytes

1

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?

    
pregunta Tom Eaton

1 respuesta

1

¿Con qué frecuencia se ejecuta el bucle principal? Probablemente se ejecuta tan a menudo que se ejecuta entre cada personaje recibido por el UART. Usted está enviando un mensaje de prueba de tres caracteres. Una vez que se reciben los dos primeros caracteres, el bucle principal realiza la comprobación y detecta el mensaje no válido. El bucle principal establece RX_BUFFER_POS en -1. Pero luego el tercer carácter llega e incrementa RX_BUFFER_POS a 0.

Después de agregar la demora al bucle principal, quizás se reciban los tres caracteres antes de que el bucle principal realice la comprobación. Si el tercer carácter se recibe antes de la comprobación, RX_BUFFER_POS permanecerá igual a -1 y parecerá que funciona.

Cuando enviaste una cadena de siete caracteres, asumiré que eran siete caracteres seguidos de "\ n". En este caso, el bucle principal verifica después de cada dos caracteres y descarta los primeros seis como no válidos. Luego se recibe el último carácter seguido de "\ n" y se pasa el cheque. Sospecho que cualquier cadena de longitud impar terminará con un "OK". Y cualquier cadena de longitud uniforme terminará con RX_BUFFER_POS = a 0 en lugar de -1 porque se recibe un carácter adicional después de que falla la comprobación anterior.

    
respondido por el kkrambo

Lea otras preguntas en las etiquetas