En la comunicación en serie asíncrona unidireccional, ¿cómo sincroniza el receptor sus bytes?

5

Quiero hacer un sistema en serie sobre RF para recibir mensajes enviados desde una computadora, de modo que pueda entender cómo funciona la radio digital. La única parte que no entiendo es cómo un remitente y un receptor sincronizan el inicio y el final de sus bytes. Parece que sería muy fácil perder la sincronización y terminar con todo cambiado en unos pocos bits. ¿Cómo sincronizan dos nodos en serie el inicio y el final de sus bytes?

    
pregunta robbie0630

4 respuestas

15

La sincronización UART para datos asíncronos se basa en el conocimiento de la velocidad de datos y en tener un reloj que suele ser 16 veces más rápido. La mitad superior de la imagen muestra cómo los datos se vuelven a sincronizar y la mitad inferior muestra un sistema mal sincronizado (velocidad de reloj 13x) solo a modo de ejemplo: -

Enausenciadecualquierbordededatos,elrelojcronometradocorrectamentepuedemuestrearlosdatoscasienlamitaddelsímbolo.Enlaimageninferior,ysinbordesdedatosparavolveraprogramarlascosas,elreloj13xeventualmentegeneraráunerror.

Parala"imagen de radio" más grande, debe enviar un preámbulo para que empiecen las cosas, es decir, no puede esperar que se bloquee de inmediato porque hay muchos factores involucrados. Aquí hay una imagen que dibujé hace un tiempo que explica cómo funcionaría un preámbulo en un transmisor y receptor de radio FM simple: -

Y here es la Respuesta anterior que incluía ese diagrama. Más información útil contenida.

    
respondido por el Andy aka
6

Los UART (rs232) tienen un bit de inicio (0) y un bit de parada (1). ver el diagrama de andys Pero usan cable y el ruido es muy bajo, básicamente ninguno.

En un enlace ruidoso, esto funciona muy mal. Si el bit de inicio es incorrecto, todo lo que está después es incorrecto y permanece así.

Las radios generalmente no hacen esto, es más probable que tengan un preámbulo que tenga una ráfaga de calentamiento de 1/0 para que se estabilicen la tx y la rx, y se sincronice con los bits, luego un bloque de sincronización mágica, por ejemplo, 32 bits Patrón único para sincronizar inicialmente bloques, luego bloques de datos con corrección de errores. Tenga en cuenta que los bloques de datos corregidos por error pueden ser de sincronización automática, solo son válidos cuando la sincronización es correcta.

Los códigos se eligen para que siempre tengan suficientes transiciones de 1/0 para mantener la sincronización de bits. es decir. no puede obtener una corrida de 32 1, siempre habrá una transición cada N bits, en el peor de los casos.

Si usa un UART por radio, el preámbulo debe ser caracteres que tengan una única transición 0/1 en ellos, para que el UART pueda volver a sincronizarse. Como debería ser obvio, si los datos fueran 1/0/1/0, entonces uart nunca sabría qué borde fue el bit de inicio. Como se puede ver en el diagrama de Andys, quiere tener un balance de aproximadamente 1/0. Entonces, 0xF0 es ideal, la secuencia será start = 0 0000 1111 stop = 1

    
respondido por el Henry Crun
2

En la comunicación asíncrona tienes una velocidad definida, la velocidad en baudios.

El receptor sabe cuánto tiempo dura un bit. Espera un borde y luego comienza a contar hasta que está en el medio del tiempo de bit. Luego toma muestras de la entrada.

La espera de en edge se hace usando 'sobremuestreo'. Usted lee el estado de entrada mucho más rápido que la velocidad de bits. Lo común es usar el muestreo excesivo 16x, pero 8x también funciona.

Existe un software gratuito que implementa un UART.
Si desea ver cómo se hace en hardware, busque el código fuente de Verilog. Si sabe C, puede casi * leer el código de Verilog.

* ¡Aparte de algunos detalles muy importantes :-)!

Lo sentimos, se perdió la parte de 'inicio y final de sus bytes'.

Un UART comienza con un bit de inicio que siempre está bajo. Termina con un bit de parada que siempre es alto. Por lo tanto, espera un 0 en la línea y sabes que ese es el bit de inicio. A continuación, cuenta por ejemplo. 10 bits (inicio, 8 datos, parada) y el décimo bit deben ser altos. Es muy posible que se muestree un flujo de bits continuo en el punto equivocado y aún así se respete el protocolo de 'inicio es bajo, alto es alto'. Por lo tanto, trato de tener jadeo entre bytes para evitar esto.

    
respondido por el Oldfart
1

Podría ser instructivo observar un algoritmo más simple para encontrar los bits de parada e inicio. Primero, muestrea la entrada a 4 veces la velocidad de bits.

Si la tasa de datos es de 9,600 bits por segundo, querrá muestrearla a 38,400 Hz.

Cuando no hay transmisión, obtendrás una gran cantidad de ruido, y la entrada de muestra puede ver altos y bajos aleatorios.

Cuando se envía un bit de inicio, lo detectará en al menos 3 muestras consecutivas. A partir de entonces, muestreará cada cuarta muestra como el bit real recibido, compensado por una muestra para que esté cerca de la mitad de cada bit.

Finalmente, recibirás el bit de parada: si no es correcto, puedes descartar todos los datos e intentarlo nuevamente, esperando un bit de inicio.

Ese es el caso simple. Una vez que lo tienes funcionando, verás que aún obtienes datos erróneos, y ahí es donde empleas más técnicas para recuperar los datos:

  • En lugar de usar solo una muestra cerca de la mitad de cada bit, observe las tres muestras que deberían ocurrir dentro del tiempo de bit y use el voto mayoritario para determinar el valor real del bit
  • Aumente la frecuencia de muestreo a 8x o 16x, lo que le proporcionará un número mucho mayor de muestras por bit para usar, y lo acercará más a la recopilación de información en todo el bit en lugar de solo 3/4 en el medio.
  • Almacene el flujo de datos mientras recibe, y use un correlateral que se mueva a lo largo del flujo para encontrar los bits de inicio y parada. De esta manera, no está tirando un posible byte porque tuvo un bit de inicio incorrecto justo antes de los datos reales.
  • En lugar de muestrear en medio de los bytes, busque las transiciones: RF envía las transiciones mejor que los niveles estáticos. Encuentre el comienzo del bit de inicio, luego use una pequeña ventana alrededor de cada transición de bit, mire para ver si hay una transición, y luego tendrá algo de información sobre el bit anterior y el siguiente.

Sin embargo, las señales USART no son apropiadas para RF. Considere buscar en la codificación de Manchester. En lugar de enviar datos como máximos / mínimos, los envía como transiciones de alto a bajo o de bajo a alto. Facilita la recuperación del reloj, ya que codifica el reloj en cada bit y opera en las transiciones, que es el amigo natural de RF. No puedes enviarlo tan rápido, pero será mucho más confiable.

También considere la detección de errores y, si es posible, la corrección de errores. Con la simple detección de errores, podrá verificar si los ajustes en su algoritmo están mejorando la señal o no de manera objetiva.

    
respondido por el Adam Davis

Lea otras preguntas en las etiquetas