Manejo de errores UART

8

No me estoy concentrando en un MCU específico ya que UART de la mayoría de los controladores tiene una arquitectura similar. Tienen FIFO para Tx y Rx.

Los errores más comunes generados por UART son: - 1. Error de encuadre 2. Error de paridad 3. Error de desbordamiento (desbordamiento de FIFO Tx / Rx) 4. Error de interrupción de recepción (algún error con bits de parada)

¿Cómo se deben manejar estas condiciones de error para mantener la comunicación correctamente?

Entiendo que es una pregunta vaga, pero la mayoría de las veces las personas se confunden acerca de lo que se debe hacer cuando se producen dichos errores y terminan simplemente borrando los bits de error.

Swanand
fuente

Respuestas:

6

Para responder realmente a su pregunta, generalmente descarto todo lo recibido con error. Eso puede incluir reinicializar el hardware de UART, según el error que sea y los detalles del hardware de UART.

La única excepción es si desea recibir pausas deliberadamente. Esos aparecen como errores de trama. En ese caso, pasa los errores de encuadre a los niveles superiores como condiciones especiales. Sin embargo, eso requiere que la información fuera de banda pase a los niveles más altos y, por lo tanto, la interfaz del receptor UART no puede verse como algo tan simple como obtener un flujo de bytes. Creo que he hecho esto exactamente una vez en muchos proyectos de microcontroladores porque tenía que ser compatible con un sistema antiguo donde los descansos se usaban deliberadamente.

Steven te ha dado algunas buenas ideas sobre qué hacer al respecto en el nivel superior. Cuando cree que hay una posibilidad real de errores y la integridad de los datos es importante, generalmente encapsula fragmentos de datos en paquetes con sumas de verificación. El receptor envía un ACK por cada suma de verificación recibida correctamente.

Sin embargo, la gran mayoría de las veces los errores UART son tan improbables y no tan críticos que puede ignorarlos en el nivel superior. El tipo de errores que el hardware UART puede detectar generalmente se debe a la estupidez del operador, no al ruido de la línea. La mayoría de los ruidos provocarán datos incorrectos, que UART no detectará. Entonces, el controlador UART de bajo nivel arroja cualquier cosa inmediatamente asociada con un error UART, pero de lo contrario continúa pasando la secuencia de bytes recibidos hasta el siguiente nivel. De hecho, hace esto incluso si está utilizando paquetes y sumas de verificación, ya que se realiza a un nivel superior al que se reciben los bytes individuales.

Olin Lathrop
fuente
9

Estos errores no se pueden corregir, por lo que se requiere retransmisión. Esto necesita un protocolo a un nivel más alto que el UART; normalmente querrá acusar recibo de la recepción correcta de un paquete de datos. Este paquete puede ser de 1 byte, pero también se pueden usar paquetes más largos si la comunicación tiene pequeños errores. Confirme cada paquete enviando un ACK al transmisor, un NACK si ha ocurrido un error. En el último caso, deseche el paquete y espere la retransmisión.
Si usa transferencias de paquetes, es posible que desee considerar la verificación de errores CRC en lugar de la paridad, que no es muy eficiente (agrega 1 bit por byte) y solo detecta errores de un solo bit.

stevenvh
fuente
3

Cuando hay un error de trama en los datos UART recibidos, las probabilidades son buenas de que todos los bytes sucesivos sean basura hasta que, dependiendo del UART, haya diez o más bits entre los bordes descendentes consecutivos en el cable de datos, diecinueve veces de espaciado consecutivo, o nueve bits veces de marcado consecutivo (el último de ellos funcionará en todos los UART). Si uno recibe un byte correctamente enmarcado con valor 0x00 o 0x80 (0x100 en modo de 9 bits) y el transmisor no envía pausas largas o el receptor dejará de intentar analizar bytes de cualquier pausa larga que el transmisor envíe, uno puede tenga la seguridad de que es correcto y que los bytes siguientes también serán correctos. Si uno recibe un valor en el que hay 0-6 "ceros" consecutivos en los bits inferiores, y los bits restantes están todos establecidos,

S = INICIAR P = datos de byte anterior s = detener D = byte actual - = inactivo
0111111101000000011111 - Señal en línea
Ps ------ SDDDDDDDDs ---: Según lo previsto por el transmisor (0x02)
SPPPPPPPPsSDDDDDDDDs-: como se recibió (0xC0)

Si cada paquete comienza con 0x00 y es seguido por 0xFF, un error de trama en un paquete no afectará al siguiente. Cuando el receptor advierte el error de trama, puede comenzar a descartar datos hasta que vea un 0x00 correctamente enmarcado, con lo que sabrá que tiene un inicio legítimo del paquete.

Super gato
fuente