Detectando el bit de inicio en el software UART

7

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

Lo que me cuesta trabajo es detectar correctamente un bit de inicio en una secuencia en serie. La fuente de la transmisión es externa y no me importa cuando mi dispositivo se enciende. Por lo tanto, es muy probable que mi dispositivo se encienda y comience a ver los 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?

    
pregunta Dan Laks

3 respuestas

4

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

Si no está utilizando el bus con mucha frecuencia, y con frecuencia tiene espacios entre los cuadros, puede que solo sea cuestión de esperar a que ocurra uno de estos espacios, y luego seleccionar la primera transmisión hi-lo. comienzo de su próximo bit de inicio.

Tenga en cuenta que el número 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 tiempo de un solo bit, aún debería poder para encontrar el bit de inicio si recoges suficientes marcos. Se garantiza que cada fotograma tiene una transición hi-lo. El bit de parada es el que siempre está alto. El bit de inicio es el que siempre está bajo. Asumiendo 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 continuar recolectando marcos y ANDARlos en este búfer hasta que el búfer solo tenga 1 conjunto de bits Este bit es tu bit de parada. El siguiente es tu bit de inicio. Voila! Lo has encontrado. La desventaja de este enfoque es que encontrar el bit de inicio lleva un poco más de tiempo que las alternativas, pero la ventaja es que puede maximizar el rendimiento al minimizar el tiempo de bit de parada y el tiempo de inactividad de su bus.

Si está utilizando un bit de paridad, otra opción sería capturar dos marcos de datos, seleccionar el primer bit bajo como bit de inicio, y luego calcular la suma de comprobación y compararla con el bit de paridad. Si coincide, entonces (probablemente) has encontrado el bit de inicio. Si no es así, seleccione el siguiente bit bajo y repita hasta que obtenga una buena suma de comprobación. Si no puede encontrar un poco en sus dos marcos de datos que se desprenden como un bit de inicio válido, entonces sus datos se corrompieron y deberá capturar dos marcos más.

    
respondido por el Dr. Funk
2

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

    
respondido por el Dave Tweed
1

Suponiendo una transmisión 8N1.

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

Si es alto, significará un intervalo de inactividad en los datos o un carácter 0xFF y un bit de STOP
     o
si es bajo, un bit de INICIO 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, podría analizar los datos entrantes repetidamente (después del hecho) para cada bit y si obtiene una serie de 7 caracteres sin sentido (bit alto establecido, minúsculas, 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 podrá realizar una evaluación a nivel de bits y también tendrá que recordar restablecer todos los bits de error de encuadre y similares cuando ocurran (especialmente en el encendido).

    
respondido por el KalleMP

Lea otras preguntas en las etiquetas