Vermeidung von Verwechslungen zwischen keiner Eingabe und einer Null in Binär?

10

Angenommen, ich übertrage Daten über FM, wobei 0 2 Hz und 1 4 Hz ist. Der Sender sendet 2 Hz, wenn kein Eingang vorhanden ist. Wie würde der Mikrocontroller zwischen keinen Daten und 0 unterscheiden, wenn ich die empfangene Binärdatei einem UART-Port eines Mikrocontrollers zuführen würde?

Dies wird beispielsweise beim Übertragen von ASCII-Zeichen relevant. Angenommen, die folgende Zeichenfolge:

01000110 01101111 01101111 01100010 01100001 01110010

Da ich Leerzeichen hinzugefügt habe, könnten wir dies übersetzen in:

Foobar

Aber für eine Maschine würde die Zeichenfolge folgendermaßen aussehen:

010001100110111101101111011000100110000101110010

Wie würden Sie diese "Leerzeichen" erstellen, damit beim Empfang von Binärdateien keine ASCII-Zeichen durcheinander geraten?

Allenph
quelle
5
Hier ist, wie UART es löst, Link . Stopp- und Startbits, da Sie sie einem UART-Port zuführen, sollten Sie sie auch übertragen.
Bence Kaulics
Ich fürchte, ich verstehe Ihr Diagramm nicht ganz. Es scheint, dass das "Startbit" einfach Null ist, was mein Problem erneut begründet. Wie würde es beispielsweise den Unterschied zwischen 01111000 und 00111100 erkennen, wenn die Zeichenfolge 000 01111000 000 wäre?
Allenph
2
@Allenph, wenn Sie nicht senden, ist der Bus inaktiv und wird in einem logisch hohen Zustand gehalten. Wenn Sie die Übertragung eines Pakets starten, ist das erste Bit immer logisch niedrig. Dies ist das Startbit. Dann folgen acht Datenbits und dann ein Stoppbit, das logisch hoch ist. Der Mikroprozessor weiß, wann das nächste Bit ankommt, da er die von Ihnen konfigurierte Busgeschwindigkeit kennt. Sowohl der Mikroprozessor als auch die Einheit, die an den Mikroprozessor sendet, müssen mit derselben Übertragungsgeschwindigkeit konfiguriert werden.
Mattias Johansson

Antworten:

16

Wenn Sie einem UART-Port eines Mikroprozessors etwas zuführen, müssen Sie das UART-Kommunikationsprotokoll befolgen, wenn der Mikroprozessor verstehen soll, was Sie ihm zuführen. Sie müssen jedes ASCI-Zeichen in ein UART-Paket einbetten, das ein Startbit, ein Stoppbit und möglicherweise ein Paritätsbit enthält. Weitere Informationen finden Sie auf der UART-Wikipedia-Seite .

Wenn Sie nicht senden, ist der Bus inaktiv und wird in einem logisch hohen Zustand gehalten. Wenn Sie die Übertragung eines Pakets starten, ist das erste Bit immer logisch niedrig. Dies ist das Startbit. Dann folgen acht Datenbits und dann ein Stoppbit, das logisch hoch ist. Der Mikroprozessor weiß, wann das nächste Bit ankommt, da er die von Ihnen konfigurierte Busgeschwindigkeit kennt. Daher ist es möglich, beispielsweise zwei Nullen nebeneinander zu übertragen. Sowohl der Mikroprozessor als auch die Einheit, die an den Mikroprozessor sendet, müssen mit der gleichen Übertragungsgeschwindigkeit, Parität und Anzahl von Stoppbits konfiguriert werden.

Mattias Johansson
quelle
2
Ein wichtiger Punkt ist, dass die konfigurierte Anzahl von Stoppbits ein Minimum und kein Maximum ist. Der Ruhezustand der asynchronen seriellen Leitung ist ein erweitertes Stoppbit. Wenn das Radio also bei 0 im Leerlauf laufen muss , besteht die einfache Antwort darin, den UART-Ausgang zu invertieren, bevor das Radio damit betrieben wird, so dass es bei 0 im Leerlauf läuft, und 1 ist ein Start. Invertieren Sie dann die empfangenen Daten, bevor Sie sie mit einem UART verarbeiten.
RBerteig
6

Dafür gibt es viele Techniken. Vielleicht möchten Sie sich die Manchester-Codierung oder die NRZ-Codes ansehen. Oder 8b / 10b-Codierung , die alle 8 Datenbits einer 10-Bit-Sequenz zuordnet , die eine Taktwiederherstellung, Fehlerkorrektur und spezielle "Kommasymbole" ermöglicht, mit denen der Beginn und das Ende einer Übertragung erkannt werden können.

pjc50
quelle
5

Alle ASCII-Zeichen sind 8 Bit breit, das können Sie in einer ASCII-Tabelle sehen. HEX-Werte von ASCII-Zeichen gehen nicht über FF hinaus (1111 1111)

UART kann nicht mehr als ein Datenbyte (8 Bit) gleichzeitig empfangen. Neben diesen 8-Bit-Daten befinden sich auch STOP- und START-Bits, PARITY und einige weitere, die Sie in der Abbildung unten sehen können und die zusammen ein UART-Kommunikationspaket bilden.

Geben Sie hier die Bildbeschreibung ein

Wenn Sie also ASCII-Zeichen an UART senden, senden Sie sie einzeln, und so wird eine Zeichenfolge erstellt. Sie wissen bereits, dass eine Zeichenfolge nur ein Array von Zeichen ist.

Lazar
quelle
4
ASCII ist 7 Bit, nicht 8, es ist jedoch üblich, es in einen 8-Bit-Biss zu setzen, um die Ausrichtung trivial zu machen. Es erlaubt auch andere Zeichensätze und utf8.
Hildred
0

Das UART-Protokoll ist, wie Mattias erklärte, ein zeitbasiertes asynchrones Protokoll. Was die Grenzen zwischen den Bits definiert, ist die Zeit, die vom Beginn des Startbits an benötigt wird. Der Mikrocontroller "tastet" also das Bit (N+half)/baudrateSekunden nach Beginn des Startbits ab. Das halbe Bit dient nur zum Abtasten in der Mitte der Bits, damit es einen halben Bitunterschied im Timing zwischen Empfänger und Sender haben kann (denken Sie daran, dass Unterschiede kumulativ sind und der schlimmste Fall im letzten Bit jedes Rahmens auftritt, was normalerweise der Fall ist). aber nicht immer 8 Bit breit, je nach Konfiguration). Der Schlüssel dafür ist, dass Empfänger und Transceiver so nah wie möglich an den Baudraten sind.

Der Mikrocontroller zählt also die Zeit zwischen jedem Bit, um zu wissen, wo sich jedes Bit innerhalb eines Rahmens befindet. Das nächste Zeichen geht in das nächste Bild. Wenn jeder Frame endet, hört der Mikrocontroller automatisch auf den nächsten Frame. Wenn also das nächste Startbit kommt, weiß er bereits, dass er einen neuen Frame starten soll. So werden die Zeichen getrennt.

Außerdem möchte ich hinzufügen, dass Sie nicht zwei Frequenzen benötigen, um an einen UART-empfangenden Mikrocontroller zu senden. Sie können eine einzelne Frequenz als OOK anstelle von zwei Frequenzen als FSK verwenden . Es hat eine höhere spektrale Effizienz und die Schaltungen sind viel einfacher, da Sie nur einen Trägerwellenumschalter als Sender und einen einzelnen Frequenzdetektor als Empfänger benötigen, ähnlich wie Morsecode. Denken Sie daran, im Allgemeinen Träger mit Frequenzen zu verwenden, die viel höher als die Baudrate sind, da sonst die einfacheren Schaltungen nicht richtig funktionieren.

Ronan Paixão
quelle