Unterschied zwischen realem Binärwert und Oszilloskopwert

Ich habe versucht, ein ASCII-Zeichen "A" mit einem Oszilloskop zu sehen, aber der tatsächliche Binärwert und die Oszilloskopwerte sind unterschiedlich, warum ist das so? ASCII "A" Binärwert - 01000001

Das Oszilloskop zeigt diese Grafik an:

ASCII A

ASCII A

Ich verwende ein Arduino Uno, um den ASCII-Wert mit dem Code zu senden:

void setup() {  
  Serial.begin(9600);  
}  

void loop() {  
  Serial.println("A");  
  delay(1000);  
}

Antworten (3)

So lesen Sie die Wellenform des Oszilloskops. Ich habe mir die Zeit genommen, Ihr Wellenformbild zu bearbeiten und zu kommentieren, um zu zeigen, welches Bit welches ist. Der Mikrocontroller sendet 10 Bits pro Zeichen; START, das immer 0 ist, 8 Datenbits und STOP, das immer 1 ist. Die Leitung ruht auch auf 1, sodass die erste fallende START-Flanke den Empfänger darauf aufmerksam macht, dass ein Byte kommt. Die Bits werden zuerst LSB gesendet. Wenn Sie sie also arithmetisch "ansehen" möchten, müssen Sie sie horizontal spiegeln, damit sie einen Sinn ergeben. Die Breite jedes Bits wird durch die Baudrate bestimmt, und Sender und Empfänger müssen beide die Baudrate kennen.

Aus dem unteren Bild können Sie sehen, dass drei Zeichen gesendet werden: ASCII-Zeichen 'A', ein Wagenrücklauf und ein Zeilenvorschub.

Geben Sie hier die Bildbeschreibung ein

Wenn es sich um eine serielle Kommunikation handelt, winken Sie so. rechts? Was sind CR und LF? Welche anderen Daten können wie CR oder LF erhalten werden?
CR ist Carriage Return, LF ist Line Feed. Zusammen bilden sie einen Zeilenumbruch, dh der Cursor springt zum Anfang der nächsten Zeile. Sie sind Teil des "ASCII"-Standards ("American Standard Code for Information Interchange"), Google "ASCII-Diagramm" oder so etwas.
@ user38701: CRLF passiert, wenn Sie die Eingabetaste drücken. Technisch gesehen soll CR die Eingabetaste und LF die Eingabetaste sein, aber die serielle Konsole interpretiert die Eingabetaste als CRLF (oder manchmal nur LF). In den meisten Programmiersprachen ist CR "\r" und LF ist "\n", aber einige Compiler/Sprachen geben CRLF für "\n" aus.
Der Wagenrücklauf ist einfach. Er benutzte einen printlnBefehl, was bedeutet, den String zu drucken, sowie ein "\r\n". Also drei Zeichen
Beachten Sie, dass Leitungsabschlüsse systemspezifisch sind. CRLF ist in erster Linie der Windows- und Arduino-Leitungsabschluss. Wenn Sie denselben Test mit einem Terminal unter Linux als Quelle des "A" wiederholen, sehen Sie nur das LF.

Wenn Sie sich die Dokumentation von Arduino println() ansehen, werden Sie sehen, dass am Ende ein Wagenrücklauf und ein Zeilenvorschub angehängt werden. In Dezimalform erhalten Sie also 65 (A), 13 (CR) und 10 (LF), was in Binärform Folgendes bedeutet:

01000001 00001101 00001010

Asynchrone serielle Daten werden zuerst als LSB gesendet, sodass daraus Folgendes wird:

10000010 10110000 01010000

Ihr Signal ist im Leerlauf hoch, also ist das Startbit 0 und das Stoppbit 1, also fügen Sie das zu jedem Byte hinzu und Sie erhalten am Ende:

0100000101 0101100001 0010100001

Es ist ein bisschen schwierig, das genaue Timing aus Ihrem Diagramm herauszuarbeiten, aber das scheint zumindest grob zusammenzupassen und sollte Ihnen eine Vorstellung davon geben, woher einige der zusätzlichen Bits stammen und warum sie neu geordnet werden. Der von Kvegaoro bereitgestellte Wikipedia-Link enthält viele gute Hintergrundinformationen zu asynchronen seriellen Daten.

Wenn dieser Stream, den Sie dort anzeigen, Asynchronous Serial ist, zeigt das Oszilloskop die entsprechenden Startbits, Stoppbits und Paritätsbits an. Berücksichtigen Sie auch, ob Ihr Signal invertiert ist oder nicht und ob es das höchstwertige Bit zuerst oder das niedrigstwertige Bit zuerst ist. Wenn Sie weitere Details über den seriellen Stream hinzufügen, den Sie im Bild dargestellt haben, können wir Ihnen eine bessere, detailliertere Antwort geben, andernfalls ist dies nur eine fundierte Vermutung