Startbit in Software UART erkennen


9

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?


Gute Frage. Sendet Ihr externes Gerät ständig Zeichen? Wenn nicht, sollten Sie überprüfen, ob das Startbit und das Stoppbit ausgerichtet sind. Und wenn die Daten dazwischen mit Ihrer Prüfung übereinstimmen (Summe / Bit)?
Paul

Können Sie den externen UART-Stream eine Präambel senden lassen? Wie ein Stream von speziellen Daten, um anzuzeigen, dass ein Stream eingeht, der sich von einem Startbit unterscheidet? Wenn Sie dies tun könnten, könnten Sie feststellen, ob die Daten fehlerhaft sind, wenn Sie sich mitten in einer Übertragung einschalten oder nicht.
Funkyguy

1
Wenn der serielle Stream keine ausreichend lange Leerlaufzeit enthält, ist es unwahrscheinlich, dass sich Ihr Youart davon erholt. Eine Teillösung kann eintreten, wenn Sie das "Stop" -Bit nicht wie erwartet erhalten. Dann könnten Sie den Status zurücksetzen und es erneut versuchen.
Eugene Sh.

1
Sie brauchen keine spezielle Präambel ... nur eine gelegentliche Pause, die länger als ein Zeichen ist (inkl. Start, Stoppbits). Oder mehr als 10 Stoppbits hintereinander, was dasselbe ist.
Brian Drummond

2
@Fuaze, das externe Gerät sendet kontinuierlich einen langen Strom von Zeichen, aber gelegentlich im Leerlauf. Im schlimmsten Fall kann ich die Eingabe einfach ignorieren, bis sie zum ersten Mal im Leerlauf ist.
Dan Laks

Antworten:


5

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.


Gute Idee, Frames UND-zusammen zu machen, bis nur die Start- und Stoppbits überleben. Das ist zu viel Aufwand für meine spezifische Anwendung, aber trotzdem klug.
Dan Laks

Wenn das externe Gerät etwas ist, über das das OP keine Kontrolle hat (was er in einem früheren Kommentar zur Frage angegeben hat), ist es unwahrscheinlich, dass er die Länge des Stoppbits ändern kann.
Tcrosley

Dieser Kommentar war noch nicht abgegeben worden, als ich anfing, diese Antwort zu schreiben. Die anderen drei Optionen, die ich aufgelistet habe, gelten jedoch weiterhin für den Fall, dass die Stoppbitlänge fest ist.
Dr. Funk

3

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.


1

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).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.