Una breve nota sobre el diseño del software "UART": existen al menos enfoques cualitativamente diferentes que uno puede adoptar, según los requisitos:
Un controlador de bit-bang "hacerse cargo de todo" deshabilitará todas las interrupciones y usará un código de conteo cíclico para registrar cada bit. La recepción de datos con un controlador "hacerse cargo de todo" requiere que cuando lleguen los datos, el controlador no haga nada más que esperarlos.
Un controlador de bit-bang "take over main loop" se comportará de manera muy similar a lo anterior, excepto que utilizará un recurso de temporizador para temporizaciones de bits en lugar de contar el ciclo. Las interrupciones que no demoran demasiado en el servicio pueden dejarse habilitadas. Para la transmisión en serie, el recurso del temporizador de velocidad fija puede compartirse con otros fines; para la recepción en serie, sin embargo, el controlador de bit-bang tendrá que poder volver a cargar el temporizador cuando llegue el bit de inicio para que expire en el medio de cada tiempo de bit entrante.
Un controlador de bit-bang completamente controlado por interrupciones utiliza un temporizador de velocidad fija que se ejecuta a un múltiplo de la velocidad de datos preferiblemente (3x y 5x son mejores que 4x), y hace todo a través de ese temporizador. Dicho controlador puede ejecutarse simultáneamente con todo lo demás, pero requerirá una CPU más rápida que la que requerirían los tipos de controladores anteriores.
Para evitar que los dos primeros estilos de controlador esperen para siempre datos que nunca llegarán, es común que las rutinas de lectura incluyan un valor de tiempo de espera. Tenga en cuenta que si el bucle de un controlador, por ejemplo, "obtiene un byte mientras espera hasta 100 ms, haga otras cosas si no llegó ninguno, luego obtenga el siguiente byte, etc." y llega un byte entre el momento en que se agota el tiempo de espera de la rutina "get" y el controlador comienza a esperar nuevamente, ese byte se perderá; el dispositivo con el que se comunica tendrá que esperar esa posibilidad.
Solo el tercer estilo de controlador podrá manejar la posibilidad de que un byte de datos comience a llegar mientras se transmite un byte de datos. Sin embargo, los primeros dos estilos se pueden usar para algunos protocolos de comunicación full-duplex a velocidad completa si el controlador solo tiene que hablar cuando se le habla. El truco consiste en tener una rutina de "lectura y escritura de datos" que esperará un bit de inicio entrante, y cuando se detecta uno superpuesto, una lectura y escritura de tal manera que el controlador envía cada bit justo cuando está a punto de examinar los datos entrantes. Una vez que el controlador detecta el bit de inicio entrante, sabrá exactamente cuándo buscará los siguientes 8 bits de datos y el bit de parada, y sabrá que puede usar el tiempo entre ellos para generar sus propios datos.
Una nota de despedida: un controlador que utiliza uno de los dos primeros estilos de bit-bang uart para recibir datos debe procesar cada byte de datos antes del límite descendente del bit de inicio del siguiente byte para evitar la pérdida de datos. Si el controlador sabe que el procesamiento tomará al menos medio bit de tiempo, puede maximizar el tiempo disponible para el procesamiento al aceptar cada byte tan pronto como haya capturado el último bit de datos, en lugar de esperar el bit de parada. Sin embargo, como otro medio de darle más tiempo al controlador, puede ser útil tener el dispositivo que le está transmitiendo datos con dos bits de parada en lugar de uno. Si se puede configurar "marcar paridad", eso agregará otro tiempo de bit adicional. La transmisión a, por ejemplo, 115200-8-M-2 permitirá más tiempo de procesamiento que 57600-8-N-1, aunque alimentará datos más de 1.6 veces más rápido.