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?
Respuestas:
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.
fuente
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.
fuente
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).
fuente