¿Cómo sabe UART la diferencia entre los bits de datos y los bits de inicio / parada? [duplicar]

5

Entiendo que es común que un esquema UART use 8N1, lo que significa 1 bit de inicio, 8 bits de datos y 1 bit de parada. Algo como esto:

0xxxxxxxx1

Donde 0 es el bit de inicio, las x son los datos y 1 es el bit de parada. En el caso de que varios marcos se envíen espalda con espalda continuamente, tendrías algo como esto:

0xxxxxxxx10xxxxxxxx10xxxxxxxx1

Mi pregunta es: ¿cómo puede el receptor distinguir la diferencia entre los bits de inicio / parada y los bits de datos? Para ilustrar este punto, suponga que el byte de datos 0xAA es una y otra vez. Esto se vería como:

0 10101010 10 10101010 10 10101010 10 10101010 10 10101010 1

Hice los bits de inicio / parada en negrita para dar énfasis, pero me parece que realmente no hay manera de distinguirlos de los bits de datos.

Claro, si el receptor ha tenido una conexión sólida y libre de errores con el transmisor desde la eternidad pasada, entonces puedo ver que esto no sería un problema. O si los bytes no se devuelven, no sería un problema. Pero he trabajado con circuitos 8N1 que continuamente transmitían bytes uno tras otro, y pude desconectar / reconectar los cables en la mitad de la transmisión y el receptor siempre volvería a recibir correctamente. ¿Cómo es esto posible?

    
pregunta Ben Hershey

5 respuestas

3

Esto parece una pregunta que proviene de alguien que intenta emular un receptor UART en un software o un FPGA. Para RS-232, utilizan el término marca y espacio . Pero estos generalmente corresponden, una vez digitalizados, a '1' y '0', respectivamente.

El receptor UART a menudo divide cada tiempo de bit (debe ser conocido, a priori) en al menos 4, pero a menudo 16 o más subperíodos. Comienza (al encender / reiniciar) en un estado en el que se espera que la línea del receptor serie esté en un estado de marca . Si la línea NO está en una marca en ese momento, sabe que está en medio de un cuadro de transmisión y debe esperar hasta que pueda sincronizarse. Si la línea está en un estado de marca , entonces puede o puede que no esté en medio de algo y tendrá que esperar y ver. Este es un problema con RS-232, si solo se conecta a otro dispositivo mientras ocurren las comunicaciones en serie o si es parte de un toque para monitorear las comunicaciones en serie asíncronas entre otros dos jugadores y se acaban de reiniciar. Para estar absolutamente seguro, cuando salga del reinicio de todos modos, el UART debería observar al menos N tiempos de bits (donde N es el número de bits por palabra, y con frecuencia 7 u 8, y suponiendo que no hay opción de paridad aquí) valor de < em> marque seguido de un bit de espacio para volver a sincronizar (o bien, N + 1 bits de espacio ). Muchos no llevan todo ese estado alrededor, para que puedan sincronizarse incorrectamente, si se inician en medio de una secuencia. A menudo obtendrá errores de encuadre y bytes de datos ocasionales, hasta que se vuelva a sincronizar accidentalmente de nuevo correctamente. Eso también suele ser un precio aceptable. Normalmente, los cables están conectados y los dispositivos se encienden en un orden de operación particular, por lo que rara vez hay problemas.

Sin embargo, una vez sincronizado, el UART sabe qué esperar. Siempre comienza con la línea del receptor que va desde una marca a un espacio , el bit de inicio necesario que dura todo el tiempo de bit, seguido por los bits de datos y luego seguido por como mínimo, un bit vale el valor de mark (o más) como bit de parada. Si permanece sincronizado, verá que el patrón se repite una y otra vez.

Parte de la razón para dividir los tiempos de bit, a algo como 4X o 16X, es que los relojes usados por el transmisor y el receptor no son necesariamente perfectamente precisos y, de lo contrario, son simplemente asíncronos entre sí. Por lo tanto, parte de la sincronización que se lleva a cabo en el receptor se encuentra en la alineación de sus periodos en dados a la sincronización del transmisor. Cuanto más preciso sea el proceso, mejor alineado estará el receptor.

    
respondido por el jonk
7

Es detectar el bit de inicio. Ese es exactamente el propósito de ello. La línea inactiva se verá así:

...1111111111111111111111111111111...

Una vez que el receptor está viendo 0 después de un largo período de unos (o después de un bit de parada, como veremos en breve), sabe que la transmisión se inicia y comienza a contar bits. Sabe que los bits 8 (o según lo definido por la configuración) después del bit de inicio son datos. El noveno es el bit de parada y debe ser 1 . Si no lo está, se produce un error de encuadre y se requiere una nueva sincronización.

Después de que se recibe el bit de parada, comienza a esperar de nuevo el bit de inicio. Y así sucesivamente.

En teoría, puede haber un problema en la sincronización si la línea parece:

..1010101010101010101.... 

o similar, por lo que en este caso el receptor no verá dónde comenzar, pero en este caso no importará realmente, ya que la posición de inicio no hará ninguna diferencia. Pero para evitar este tipo de problemas, algunos protocolos definen una longitud de 1.5 (uno y medio) para que el bit de parada sea único. O, en la práctica, siempre hay algunos retrasos de tiempo entre dos paquetes de datos, por lo que la línea está inactiva durante el tiempo suficiente para permitir que el receptor se sincronice.

    
respondido por el Eugene Sh.
1

UART necesita silencio al principio para capturar el primer bit de inicio. Luego, solo cuenta de acuerdo con la cantidad predefinida de bits, alcanza el bit de parada y espera nuevamente el bit de inicio. Si UART comienza a recibir en medio de un largo mensaje, fácilmente puede recibir solo correo no deseado.

    
respondido por el Gregory Kornblum
1

Puede notar la diferencia porque sabe dónde deberían estar en el flujo de bits (porque le dijiste).

Solo recuerda que cualquier símbolo no tiene sentido hasta que hay un significado acordado.

    
respondido por el pgvoorhees
1

Si el inactivo preexiste, no se producen errores, no hay problema, pero cualquier error, como la saturación del búfer, requiere algún método de agitación manual, después de lo cual se produce el estado de inactividad y debe sincronizarse nuevamente desde el primer bit de inicio.

El protocolo de enlace es necesario para comunicar la detección del búfer lleno, sobre ejecución, error de paridad o error de bit de parada.

La paridad impar es útil aquí para detectar un error de datos o un error de trama para reanudar la sincronización correcta de los bits de inicio y la comunicación sin errores.

    
respondido por el Tony EE rocketscientist

Lea otras preguntas en las etiquetas