Was ist Serial.begin (9600)?


Antworten:


22

Serial.begin(9600)druckt eigentlich gar nichts. Dazu möchten Sie Serial.print("Hello world!")den Text "Hallo Welt!" an die serielle Konsole. Vielmehr wird die serielle Verbindung mit 9600 Bit pro Sekunde initialisiert.

Beide Seiten der seriellen Verbindung (dh der Arduino und Ihr Computer) müssen so eingestellt sein, dass sie dieselbe serielle Geschwindigkeitsverbindung verwenden, um verständliche Daten zu erhalten. Wenn die beiden Systeme der Meinung sind, dass die Geschwindigkeit nicht übereinstimmt, werden die Daten unkenntlich gemacht.

9600 Bit pro Sekunde ist die Standardeinstellung für den Arduino und für die meisten Benutzer vollkommen ausreichend. Sie können sie jedoch auf eine andere Geschwindigkeit Serial.begin(57600)einstellen: Der Arduino würde so eingestellt, dass er mit 57600 Bit pro Sekunde sendet. Sie müssen die auf Ihrem Computer verwendete Software (wie den seriellen Monitor der Arduino IDE) auf die gleiche Geschwindigkeit einstellen, um zu sehen, welche Daten gesendet werden.


2
Baud und BPS sind zwei verschiedene Dinge ... Ich kann den gesuchten Link nicht finden.
Anonymous Penguin

Was ist, wenn ich "Serial.begin (0)" setze? oder "Serial.begin (4000)". Ich meine, ich möchte wissen, was der Unterschied zwischen den Zahlen ist.
shajib0o

3
Serial.begin wird verwendet, um die Kommunikationsgeschwindigkeit in Bit pro Sekunde festzulegen. Ein Byte entspricht 8 Bits, aber serielle Verbindungen senden ein Start- und ein Stoppbit, um den Anfang und das Ende eines bestimmten Bytes an das empfangende System zu identifizieren. Somit werden 10 Bits benötigt, um ein Zeichen zu senden. Using Serial.begin(0)teilt dem Arduino mit, dass er mit 0 Bits pro Sekunde seriell kommunizieren soll. Wie zu erwarten, bedeutet dies, dass der Arduino niemals Daten sendet. Serial.begin(4000)veranlasst den Arduino, Daten mit 4000 Bits pro Sekunde zu senden. Dies ist kein Standard, aber ansonsten in Ordnung.
Heypete

2
Kurz gesagt: Durch Ändern der Nummer wird die Geschwindigkeit geändert. Durch Verringern der Zahl (z. B. Serial.begin(300)) sendet der Arduino Daten langsamer. Wenn Sie die Zahl auf 57600 erhöhen, werden die Daten schneller gesendet. Sowohl das sendende als auch das empfangende System müssen sich auf die zu verwendende Geschwindigkeit einigen: Mit dem seriellen Programm Ihres Computers, wie dem Arduino Serial Monitor-Fenster, können Sie die Geschwindigkeit einstellen, mit der Ihr Computer Daten empfängt. Sie können jedoch nur eine gemeinsame Geschwindigkeit auswählen Geschwindigkeiten: 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600 und 11520 Bit / Sek. Andere Geschwindigkeiten wie 4000 können nicht eingegeben werden. 9600 ist normalerweise gut.
Heypete

Baud and BPS are two different things... can't find the link I was looking for now.- Hier ist eine Erklärung: Anhang C: "Baud" gegen "Bps"
Nick Gammon

21

Ein Bild sagt mehr als 1000 Worte (1024 Worte, wenn Sie mit Computern arbeiten), also werde ich ein paar Bilder posten ...

Ich habe mein Uno so eingestellt, dass es "Fab" mit 9600 Baud sendet und die Ergebnisse auf einem Logikanalysator erfasst.

Serienkommunikation - 3 Buchstaben

Die rot schattierten Teile geben die "Leerlauf" -Periode zwischen Bytes an.

Aus der obigen Grafik geht hervor, dass die Sende- (Sende-) Datenleitung normalerweise hoch (1) ist, bis sie niedrig abfällt, um den Beginn eines Zeichens (Byte) anzuzeigen. Dies ist das Startbit . Dann erscheinen die 8 Datenbits (angezeigt durch weiße Punkte) mit der Baudrate (9600 Abtastungen pro Sekunde). Danach wird die Linie wieder hoch gebracht. Dies ist das Stoppbit (der rote Teil). Dann sehen wir das Startbit für das nächste Zeichen und so weiter. Der "Stopp" -Teil kann unendlich lang sein, muss jedoch mindestens eine Bitlänge haben.


Weitere Details zum ersten Zeichen (der Buchstabe "F" oder 0x46 oder 0b01000110) finden Sie hier:

Serielle Kommunikation - ein einzelnes Byte

  • A - keine Daten (Tx ist hoch)

  • B - Das "Startbit". Die Leitung wird auf LOW geschaltet, um dem Empfänger mitzuteilen, dass ein Zeichen (Byte) gesendet wird. Der Empfänger wartet anderthalb Uhrzeiten, bevor er die Leitung abtastet.

  • C - Das erste Zeichen kommt an (der Buchstabe "F" oder 0x46 oder 0b01000110). Es gibt kein Taktbit als solches, die eingehenden Daten werden einfach mit der Baudrate (Übertragungsrate) abgetastet. Im Gegensatz zur SPI-Kommunikation kommen die Daten mit dem niedrigsten Bit zuerst an (falls Sie nicht 8 Bits pro Byte senden). So sehen wir 01100010 (anstatt 01000110).

  • D - Das Stoppbit. Dies ist immer hoch, um sicherzustellen, dass wir zwischen dem Ende dieses Bytes und dem Beginn des nächsten Bytes unterscheiden können. Da das Startbit eine Null und das Stoppbit eine Eins ist, gibt es immer einen klaren Übergang von einem Byte zum nächsten.

  • E - Das Startbit für das nächste Zeichen.


An der Erfassung des Logikanalysators können Sie erkennen, dass sie T1 - T20,1041667 ms beträgt, und dass sie zufällig 1/9600 beträgt:

1 / 9600 = 0.00010416666 seconds

Die Rate von 9600 gibt Ihnen also die Anzahl der Bits pro Sekunde und die Umkehrung das Zeitintervall zwischen den Bits .


Andere Überlegungen

  • Serielle Kommunikationen werden nicht automatisch getaktet (im Gegensatz zu SPI oder I2C und anderen), daher müssen sich Sender und Empfänger auf eine Taktrate einigen.

  • Die Taktrate ist auf dem Arduino nicht genau, da die Hardware die Systemtaktung aufteilen muss, um eine serielle Taktung zu erhalten, und die Aufteilung ist nicht immer genau. Es liegt fast immer ein Fehler vor, der Betrag ist im Datenblatt angegeben (Angaben für einen 16 MHz Systemtakt, wie auf der Uno):

    Fehler bei der seriellen Baudrate

  • Sie können die Anzahl der Datenbits variieren, Sie müssen nicht 8 davon senden, sondern Sie können 5 bis 9 Bits senden.

  • Optional kann nach den Datenbits ein Paritätsbit gesendet werden.

    • Wenn Sie "ungerade" Parität angeben, wird das Paritätsbit so gesetzt, dass die Gesamtzahl der 1-Bits ungerade ist.
    • Wenn Sie "gerade" Parität angeben, wird das Paritätsbit so gesetzt, dass die Gesamtzahl der 1-Bits gerade ist.
    • Wenn Sie keine Parität angeben, wird das Paritätsbit weggelassen.

    Auf diese Weise kann der Empfänger feststellen, ob die Daten korrekt eingegangen sind oder nicht.

  • Das Paritätsbit wird vor dem Stoppbit gesendet.

  • Im Fall von 9 Datenbits (wie im SeaTalk-Protokoll verwendet) wird das Paritätsbit als 9. Datenbit neu bestimmt. Daher können Sie nicht beide 9 Datenbits und ein Paritätsbit haben.

  • Sie können auch zwei Stoppbits haben. Dies verlängert im Grunde nur die Zeit zwischen Bytes. In den "alten Tagen" war dies so, dass langsame elektromechanische Geräte das vorherige Byte verarbeiten konnten (z. B. um es zu drucken).


Mögliche Korruption

Wenn Sie mitten in einem Stream mit dem Abhören serieller Daten beginnen, ist es durchaus möglich, dass ein 0-Bit in der Mitte des Streams als Startbit interpretiert wird und der Empfänger danach alles falsch interpretiert.

Die einzige wirkliche Möglichkeit, sich davon zu erholen, besteht darin, von Zeit zu Zeit eine ausreichende Lücke (z. B. 10 Bit lang) zu haben, damit dies nicht passieren kann.


Invertierte Logik

Die hier gezeigten Bits (Logikpegel) sind nicht invertiert. Das heißt, ein 1-Bit ist HOCH und ein 0-Bit ist NIEDRIG. Wenn Sie über RS232-Geräte verfügen, werden wahrscheinlich -12 V für ein 1-Bit und +12 V für ein 0-Bit gesendet. Dies ist invertiert, weil eine Eins spannungsmäßig kleiner als eine Null ist.

Wenn Sie solche Geräte haben, müssen Sie eine Spannungsumwandlung und eine Logikumwandlung durchführen. Chips wie der MAX232 erledigen beides für Sie. Sie können auch die -12 V liefern, die für die Ansteuerung solcher Geräte erforderlich sind, indem sie diese mithilfe einiger vom Benutzer bereitgestellter Kondensatoren intern erzeugen.


Geschwindigkeitsregel

Da wir mit einem Startbit, 8 Datenbits und einem Stoppbit insgesamt 10 Bits haben, können Sie als Faustregel die Anzahl der Bytes berechnen, die Sie in einer Sekunde übertragen können, indem Sie die Bitrate durch 10 dividieren .

Z.B. Bei 9600 BPS können Sie 960 Bytes pro Sekunde senden.


Zu reproduzierender Code:

void setup() 
  { 
  Serial.begin(9600); 
  Serial.print("Fab"); 
  } 

void loop ()
  {
  }

1

TLDR; Es initialisiert den seriellen Kommunikationsanschluss und stellt die Baudrate ein. Das Gerät, mit dem Sie kommunizieren (oder Arduino IDE Serial Monitor), muss auf eine passende Baudrate eingestellt sein. Sobald Sie den Port initialisiert haben, können Sie mit dem Senden oder Empfangen von Zeichen beginnen. Arduino-Seriennummer


Nicht zu vermindern oder zu respektieren @ Nick-Gammons hervorragende Berichterstattung über dieses Thema.
Linhartr22

-3

Es gibt das Programm an, das im Computersystem ausgeführt werden soll. Die Zahlen geben die Geschwindigkeit an. Serial.print gibt an, welcher Text angezeigt werden soll


3
Was bedeutet dies für die aktuell akzeptierte Antwort?
Ignacio Vazquez-Abrams

1
Nutzlose Antwort, zum Löschen abstimmen
Smirkingman
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.