es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Algoritmo de Sincronización UART para recibir una secuencia de datos.

Estoy recibiendo este marco $0, S1, B2, Kffffffffffff, T61*34 a través de UART con este código.

// Recibir datos
for (uint8_t i = 0; i < size; i++) {
receivedFrame[i] = EUSART1_Read();
if (receivedFrame[i] == ‘'*'’) {
size = i + 3;
}
}

El inicio del marco siempre es $ y el final siempre es *, después vienen dos bytes que contienen la suma de verificación para los bytes anteriores (por ejemplo, 34).

La longitud del marco no es fija, pero tiene una longitud mínima de 26 (desde $ hasta *) + 2 bytes de suma de verificación y una longitud máxima de 62 y también + 2 bytes de suma de verificación.

Sin embargo, no es lo mejor de usar, ya que pueden ocurrir muchos escenarios que pueden hacer que esto sea inestable, por ejemplo, si el símbolo * no llega, cada marco que leo será incorrecto.

Busqué una mejor manera de recibir datos a través de UART, pero no logré encontrar nada. Estoy buscando mejores formas de manejar la recepción de marcos como este.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en C, sistemas empotrados y UART, recomiendo implementar un método más robusto para recibir frames a través de UART. Una opción es utilizar un buffer que pueda contener una longitud máxima del frame esperado y añadir continuamente los bytes entrantes hasta que se haya recibido el frame completo. Esto se puede hacer mediante interrupciones o mediante sondeo.

    Un ejemplo de cómo utilizar interrupciones para recibir un frame sería configurar UART para que active una interrupción cada vez que se recibe un byte. En el manejador de interrupciones, el byte recibido se puede añadir al buffer hasta que se detecte el final del frame. Una vez que se haya recibido el frame completo, se puede procesar y se puede borrar el buffer.

    Alternativamente, se puede utilizar el sondeo para verificar si hay bytes entrantes en intervalos regulares. Los bytes recibidos se pueden añadir al buffer hasta que se detecte el final del frame. Una vez que se haya recibido el frame completo, se puede procesar y se puede borrar el buffer.

    En general, mediante el uso de un enfoque basado en buffer se permite una mayor flexibilidad en el manejo de frames de diferentes longitudes y se reduce la posibilidad de recibir datos incorrectos debido a frames perdidos o incompletos.

Comments are closed.