Ein kurzer Hinweis zum Software "UART" -Design: Es gibt zumindest qualitativ unterschiedliche Ansätze, die man je nach Anforderung verfolgen kann:
Ein Bit-Bang-Treiber "Alles übernehmen" deaktiviert alle Interrupts und verwendet zyklisch gezählten Code, um jedes Bit zu takten. Das Empfangen von Daten mit dem Treiber "Alles übernehmen" setzt voraus, dass der Controller beim Eintreffen von Daten nur darauf wartet.
Ein Bit-Bang-Treiber zum Übernehmen der Hauptschleife verhält sich ähnlich wie oben, außer dass er eine Timer-Ressource für Bit-Timings verwendet, anstatt die Zyklen zu zählen. Interrupts, die nicht zu lange dauern, können aktiviert bleiben. Für die serielle Übertragung kann die Zeitgeberressource mit fester Rate mit anderen Zwecken geteilt werden; Für den seriellen Empfang muss der Bit-Bang-Treiber jedoch in der Lage sein, den Timer neu zu laden, wenn das Startbit eintrifft, damit es in der Mitte jeder eingehenden Bitzeit abläuft.
Ein vollständig unterbrechungsgesteuerter Bit-Bang-Treiber verwendet einen Timer mit fester Rate, der vorzugsweise mit einem Vielfachen der Datenrate ausgeführt wird (3x und 5x sind beide besser als 4x), und erledigt alles über diesen Timer. Ein solcher Treiber kann gleichzeitig mit allen anderen ausgeführt werden, erfordert jedoch eine schnellere CPU als die früheren Treibertypen.
Um zu vermeiden, dass die ersten beiden Arten von Controllern ewig auf Daten warten, die möglicherweise nie eingehen, wird in Leseroutinen häufig ein Timeout-Wert angegeben. Beachten Sie, dass, wenn die Schleife eines Controllers z. B. "ein Byte abruft, während bis zu 100 ms darauf gewartet werden", andere Vorgänge ausgeführt werden, wenn keines kam, dann das nächste Byte abruft usw. " und ein Byte kommt zwischen dem Zeitpunkt an, zu dem die "Abruf" -Routine abgelaufen ist und die Steuerung wieder zu warten beginnt, geht dieses Byte verloren; Das Gerät, mit dem es kommuniziert, muss mit dieser Möglichkeit rechnen.
Nur der dritte Treibertyp kann die Möglichkeit des Eintreffens eines Datenbytes behandeln, während ein Datenbyte übertragen wird. Die ersten beiden Stile können jedoch für einige Vollgeschwindigkeits-Vollduplex-Kommunikationsprotokolle verwendet werden, wenn der Controller nur sprechen muss, wenn er angesprochen wird. Der Trick besteht darin, eine "Daten lesen und schreiben" -Routine zu haben, die auf ein eingehendes Startbit wartet, und wenn eines erkannt wird, Lese- und Schreibvorgänge so zu überlappen, dass die Steuerung jedes Bit sendet, während sie die eingehenden Daten untersucht. Sobald die Steuerung das eingehende Startbit erkennt, weiß sie genau, wann sie nach den nächsten 8 Datenbits und dem Stoppbit suchen soll, und weiß daher, dass sie die Zeit zwischen den Daten sicher verwenden kann, um ihre eigenen Daten auszugeben.
Ein Teil: Ein Controller, der zum Empfangen von Daten einen der ersten beiden Bit-Bang-Arten verwendet, muss jedes Datenbyte vor der fallenden Flanke des Startbits des nächsten Bytes verarbeiten, um Datenverlust zu vermeiden. Wenn die Steuerung weiß, dass die Verarbeitung mindestens ein halbes Bit dauert, kann sie die für die Verarbeitung verfügbare Zeit maximieren, indem sie jedes Byte akzeptiert, sobald es das letzte Datenbit erfasst hat, anstatt auf das Stoppbit zu warten. Als weiteres Mittel, um dem Controller mehr Zeit zu geben, kann es jedoch hilfreich sein, das Gerät, das ihm Daten sendet, mit zwei Stoppbits anstatt mit einem zu beauftragen. Wenn "Parität markieren" konfiguriert werden kann, wird eine weitere zusätzliche Bitzeit hinzugefügt. Die Übertragung bei z. B. 115200-8-M-2 ermöglicht eine längere Verarbeitungszeit als 57600-8-N-1, obwohl Daten mehr als 1,6-mal schneller eingespeist werden.