Detección de bit de inicio en software UART

9

Estoy experimentando con escribir un software UART en mi microcontrolador usando pines GPIO. Esto es para agregar temporalmente un canal UART en un proyecto hasta que implementemos el nuevo diseño que usa un uC con más puertos UART.

Lo que me está costando es detectar correctamente un bit de inicio en una transmisión en serie. La fuente de la transmisión es externa y no le importa cuando mi dispositivo se enciende. Por lo tanto, es muy probable que mi dispositivo se encienda y comience a ver bits de datos en medio de una transmisión de bytes. Sin lugar a dudas, eso hará que mi software UART lea valores erróneos, ya que no podrá distinguir la diferencia entre un bit de inicio y cualquier otra transición de alto a bajo.

¿Es este un problema inevitable con un canal UART? ¿O hay algún truco inteligente que los fabricantes de uC usan en sus UART de hardware?

Dan Laks
fuente
Buena pregunta. ¿Su dispositivo externo envía caracteres continuamente? De lo contrario, debe verificar si el bit de inicio y el bit de detención están alineados. ¿Y si los datos intermedios coinciden con su cheque (suma / bit)?
Paul
¿Puede hacer que la transmisión UART externa envíe un preámbulo? ¿Como una secuencia de datos especiales para indicar que una secuencia es entrante que sería distinta de un bit de inicio? Si pudiera hacer eso, entonces podría saber si los datos son erróneos si se enciende en medio de una transmisión o no.
Funkyguy
1
Si la transmisión en serie no contiene un período de inactividad suficientemente largo, es poco probable que su corazón se recupere de esto. Puede llegar a una solución parcial en caso de que no reciba el bit de "detención" donde se esperaba. Entonces podrá restablecer el estado y volver a intentarlo.
Eugene Sh.
1
No necesita un preámbulo especial ... solo un descanso ocasional de más de un personaje (incluido inicio, bits de parada). O más de 10 bits de parada seguidos, que es lo mismo.
Brian Drummond
2
@Fuaze, el dispositivo externo envía una larga secuencia de caracteres de forma continua, pero ocasionalmente permanece inactivo. En el peor de los casos, puedo ignorar la entrada hasta la primera vez que está inactiva.
Dan Laks

Respuestas:

5

Si utiliza una longitud de bits de parada que se distingue fácilmente del resto de la secuencia de datos, como el tiempo de 1,5 bits, entonces debería ser fácil comenzar a recibir la transmisión media. Sin embargo, esto tiene un costo de aumento de los gastos generales. Su rendimiento total de datos disponibles se verá afectado a medida que aumente la longitud de su bit de parada.

Si no está utilizando el bus con tanta frecuencia, y con frecuencia tiene espacios entre cuadros, entonces puede ser solo cuestión de esperar a que ocurra uno de estos espacios, y luego recoger la primera transmisión de alta frecuencia como el comienzo de su siguiente comienzo poco.

Tenga en cuenta que la cantidad de bits de datos debe ser predecible, al igual que el tamaño de la trama, por lo que incluso si está utilizando el 100% de la capacidad del bus y su bit de parada es un solo bit, aún debería poder encontrar el comience un poco si recolecta suficientes cuadros. Se garantiza que cada cuadro tendrá una transición alta-baja. El bit de parada es el que siempre es alto. El bit de inicio es el que siempre es bajo. Suponiendo que sus datos son aleatorios (o lo suficientemente aleatorios), podría hacer algo tan simple como crear un búfer del tamaño de su marco, establecer cada bit en él y luego seguir recopilando marcos y ANDándolos en este búfer hasta que el búfer solo tenga 1 bit establecido Este bit es tu bit de parada. El que sigue es tu bit de inicio. Voila! Lo has encontrado.

Si está utilizando un bit de paridad, otra opción sería tomar dos cuadros de datos, elegir el primer bit bajo como el bit de inicio y luego calcular la suma de verificación y comparar con el bit de paridad. Si coincide, entonces (probablemente) haya encontrado el bit de inicio. Si no es así, elija el siguiente bit bajo y repita hasta obtener una buena suma de comprobación. Si no puede encontrar un bit en sus dos cuadros de datos que se verifique como un bit de inicio válido, entonces sus datos se corrompieron y deberá tomar dos cuadros más.

Dr. Funk
fuente
Buena idea para AND juntos marcos hasta que solo los bits de inicio y parada sobrevivan. Eso será demasiado sobrecarga para mi aplicación específica, pero inteligente de todos modos.
Dan Laks
Si el dispositivo externo es algo sobre lo que el OP no tiene control (sobre lo que ha declarado en un comentario anterior a la pregunta), es poco probable que pueda cambiar la longitud del bit de parada.
tcrosley
Ese comentario no se había hecho cuando comencé a escribir esta respuesta. Sin embargo, las otras tres opciones que he enumerado todavía se aplican en el caso de que la longitud del bit de detención sea fija.
Dr. Funk
3

Los UART de hardware tienen el mismo problema. Pero generalmente es uno que se resuelve en poco tiempo de todos modos. Al final de cada cuadro, verifique el bit de parada, y si no es alto, descarte el cuadro y espere la próxima transición de alto a bajo. Suponiendo que los datos de la fuente no son totalmente patológicos (p. Ej., Cadenas largas de "UUUU" o ASCII 0x55), el UART eventualmente "caminará" hasta el bit de inicio real.

Dave Tweed
fuente
1

Suponiendo la transmisión 8N1.

Debe esperar una cadena de 9 bits altos o bajos seguidos.

Si es alto, significará una brecha inactiva en los datos o un carácter 0xFF y un bit STOP
o,
si es bajo, un bit START y un carácter NULL 0x00.

Cualquiera de estas condiciones permitirá la resincronización.

Para acelerarlo: si conoce ciertos caracteres que no son posibles en los datos, puede analizar los datos entrantes repetidamente (después del hecho) para cada bit y si obtiene una serie de 7 caracteres sin sentido (conjunto de bits alto, menor caso, códigos de control, puntuación o lo que sea) seguido de un carácter válido, puede estar bastante seguro de que está resincronizado.

Tendrá problemas similares cuando use un periférico UART incorporado y no pueda realizar una evaluación a nivel de bits y también tenga que recordar restablecer todos los bits de error de trama y tales cuando ocurran (especialmente al encender).

KalleMP
fuente