Arduino Serial Error Correction

0

Actualmente tengo una configuración en la que tomo la salida en serie de Arduino 1 y la empujo a través del transmisor al receptor de Arduino 2, donde se envía de nuevo a la entrada en serie y se procesa. Quiero asegurarme de que haya el menor error posible y recuperar los datos siempre que sea posible.

Me he encontrado con la técnica de decodificación del síndrome, que parece ser la ideal para mí, pero estoy confundido en cuanto a cómo lo implementaría.

Sé que Arduino Serial transfiere los datos byte a byte, cada uno de ellos de 8 bits, pero no sé cómo se envían estos datos a través de la conexión en serie (es decir, cómo se implementan los bits de inicio y parada y la paridad).

Supongo que una solución a esto podría implicar modificar los datos en el búfer o leerlos desde el búfer y luego operar sobre ellos. También podría usar bytes de datos adyacentes para la corrección de errores, pero esto parece un desperdicio.

¿Cómo debo proceder con esto?

    
pregunta thirdattempt

2 respuestas

2

Solución de software fácil

Una solución de software fácil sería enviar los datos dos veces, primero recibirlos y luego verificarlos. Es altamente improbable que exactamente los mismos bits fallen dos veces. Tal vez, con fines educativos, puede intentar hacer un algoritmo que envíe una suma de comprobación.

Entonces, cuando se envíe dos veces y se reciba dos veces (exactamente lo mismo), se verificará. Si esto falla, su línea de comunicación sería demasiado ruidosa.

Sin embargo, para una solución estable, siempre debe verificar los errores de hardware, ya que algunos microcontroladores simplemente dejan de recibir / enviar errores de hardware. Además, si no le gusta la sobrecarga del software de verificación, los errores de hardware dan una buena visión de lo que sucedió y es probable que detecten errores incluso sin software adicional (aparte del manejo).

Solución de hardware

La propia UART en realidad tiene un control de errores incorporado. Y cuando usas una velocidad de transmisión correcta (algo que se adapta bien a tu velocidad de reloj), es poco probable que recibas mal los caracteres de uart. Pero por el bien de la estabilidad deberías manejar estos errores. Y si realmente necesita capturar todos los caracteres, incluso debería implementar que descarte y solicite la retransmisión de un error (ya que el carácter que genera el error debe considerarse perdido). Además, si tiene muchos errores en su UART, tenga en cuenta que es probable que sea un error de hardware, es decir, un ruido en la línea o una velocidad de transmisión incorrecta

  

Debe manejar los errores de UART si desea crear un sistema estable.

errores de ejecución excesiva , cuando se recibe un nuevo carácter antes de que se maneje el carácter en el búfer de recepción. (Su código debe leer los caracteres más rápido de lo que lo hace su tasa de baudios (el código de recepción de uart impulsado por interrupciones ayudará))

error de paridad , un bit de paridad determina si el mensaje completo es par o impar (simplificado), por lo que si falla un bit, el bit de paridad no corresponderá con el mensaje, por lo que el hardware del receptor lo sabe. poco fue mal recibido. Aunque es poco probable, esto no funcionará bien si falla una cantidad uniforme de bits, por lo que la paridad se justifica de nuevo.

Error de encuadre , como UART tiene bits de inicio y parada, es posible saber cada vez que haya recibido un mensaje completo. Cuando este mensaje es demasiado largo / demasiado corto o simplemente no se ajusta a la configuración (¿aparte de la velocidad en baudios?), Se creará un error de encuadre.

Más información en hoja de datos 20.7.4 Indicadores de error del receptor

Entonces, al menos, deberías revisar los errores de hardware, esto da una conexión bastante estable. Asegúrese de implementar algo que borre los registros de errores (podrían causar que la recepción / envío adicional falle) y vuelva a enviar el mensaje, para que el otro dispositivo se "sincronice" nuevamente.

    
respondido por el Paul
0

El UART debe tener un registro de control / error que tenga un indicador de error de paridad. Styudy the Atmel ATMega328 hoja de datos para encontrar los detalles.

    
respondido por el Peter Bennett

Lea otras preguntas en las etiquetas