Ich experimentiere mit dem Schreiben eines Software-UART auf meinem Mikrocontroller mithilfe von GPIO-Pins. Dies dient dazu, einem Projekt vorübergehend einen UART-Kanal hinzuzufügen, bis das neue Design implementiert ist, das eine uC mit mehr UART-Ports verwendet.
Ich habe Probleme damit, ein Startbit in einem seriellen Stream korrekt zu erkennen. Die Quelle des Streams ist extern und es ist egal, wann mein Gerät hochfährt. Es ist also sehr wahrscheinlich, dass sich mein Gerät einschaltet und Datenbits mitten in einer Byteübertragung sieht. Zweifellos führt dies dazu, dass mein Software-UART fehlerhafte Werte liest, da er den Unterschied zwischen einem Startbit und einem anderen Übergang von hoch nach niedrig nicht erkennen kann.
Ist dies ein unvermeidliches Problem mit einem UART-Kanal? Oder gibt es einen cleveren Trick, den die uC-Hersteller in ihren Hardware-UARTs verwenden?
Antworten:
Wenn Sie eine Stoppbitlänge verwenden, die vom Rest des Datenstroms leicht zu unterscheiden ist, z. B. 1,5 Bit Zeit, sollte es einfach sein, den Empfang während der Übertragung zu starten. Dies ist jedoch mit einem erhöhten Overhead verbunden. Ihr gesamter verfügbarer Datendurchsatz leidet, wenn Sie die Länge Ihres Stoppbits erhöhen.
Wenn Sie den Bus nicht so stark nutzen und häufig Lücken zwischen den Frames haben, müssen Sie möglicherweise nur darauf warten, dass eine dieser Lücken auftritt, und dann die erste Hi-Lo-Übertragung als Anfang Ihrer Daten aufnehmen nächstes Startbit.
Beachten Sie, dass die Anzahl der Datenbits vorhersehbar sein sollte, ebenso wie die Rahmengröße. Selbst wenn Sie 100% der Buskapazität nutzen und Ihr Stoppbit eine Einzelbitzeit ist, sollten Sie dennoch in der Lage sein, die zu finden Startbit, wenn Sie genügend Frames sammeln. Jeder Frame hat garantiert einen Hi-Lo-Übergang. Das Stoppbit ist dasjenige, das immer hoch ist. Das Startbit ist dasjenige, das immer niedrig ist. Angenommen, Ihre Daten sind zufällig (oder zufällig genug), können Sie einfach einen Puffer in der Größe Ihres Frames erstellen, jedes Bit darin setzen und dann weiterhin Frames sammeln und in diesen Puffer UND-verknüpfen, bis der Puffer nur noch 1 enthält Bit gesetzt. Dieses Bit ist Ihr Stoppbit. Der nachher ist dein Startbit. Voila! Du hast es gefunden.
Wenn Sie ein Paritätsbit verwenden, besteht eine andere Möglichkeit darin, Daten im Wert von zwei Frames zu erfassen, das erste niedrige Bit als Startbit auszuwählen, dann die Prüfsumme zu berechnen und mit dem Paritätsbit zu vergleichen. Wenn es übereinstimmt, haben Sie (wahrscheinlich) das Startbit gefunden. Wenn dies nicht der Fall ist, wählen Sie das nächste niedrige Bit und wiederholen Sie den Vorgang, bis Sie eine gute Prüfsumme erhalten. Wenn Sie in Ihren beiden Datenrahmen kein Bit finden, das als gültiges Startbit ausgecheckt wird, wurden Ihre Daten beschädigt, und Sie müssen zwei weitere Frames abrufen.
quelle
Hardware-UARTs haben das gleiche Problem. Aber es ist normalerweise eines, das sich sowieso in kurzer Zeit von selbst löst. Überprüfen Sie am Ende jedes Frames das Stoppbit. Wenn es nicht hoch ist, verwerfen Sie den Frame und warten Sie auf den nächsten Übergang von hoch nach niedrig. Unter der Annahme, dass die Daten aus der Quelle nicht vollständig pathologisch sind (z. B. lange Zeichenfolgen von "UUUU" oder ASCII 0x55), "geht" der UART schließlich selbst zum eigentlichen Startbit über.
quelle
Annahme einer 8N1-Übertragung.
Sie müssen auf eine Zeichenfolge mit 9 hohen oder niedrigen Bits hintereinander warten.
Wenn hoch, bedeutet dies entweder eine Leerlauflücke in den Daten oder ein 0xFF-Zeichen und ein STOP-Bit,
oder
wenn niedrig, ein START-Bit und ein NULL-0x00-Zeichen.
Eine dieser Bedingungen ermöglicht eine Resynchronisation.
Um es zu beschleunigen: Wenn Sie bestimmte Zeichen kennen, die in den Daten nicht möglich sind, können Sie die eingehenden Daten wiederholt (nachträglich) für jedes Bit analysieren, und wenn Sie eine Reihe von 7 Zeichen erhalten, die Unsinn sind (hohes Bit gesetzt, niedriger) Groß- / Kleinschreibung, Steuercodes, Interpunktion oder was auch immer) gefolgt von einem gültigen Zeichen. Sie können ziemlich sicher sein, dass Sie neu synchronisiert sind.
Sie haben ähnliche Probleme, wenn Sie ein eingebautes UART-Peripheriegerät verwenden und keine bitweise Auswertung durchführen können. Außerdem müssen Sie daran denken, alle Framing-Fehlerbits und dergleichen zurückzusetzen, wenn sie auftreten (insbesondere beim Einschalten).
quelle