Serial.begin (): Warum nicht immer 28800 verwenden?


35

In vielen Online-Beispielcodes wird die Zeile Serial.begin(9600)im Setup-Block hinzugefügt .

Wenn ich nachschaue, was Serial.begin()in der offiziellen Dokumentation steht, heißt es, dass die Datenübertragung mit Bit pro Sekunde gesteuert wird.

Die naheliegende Frage ist also, warum nicht 28800, die höchste Übertragungsrate, verwenden? Warum entscheiden sich die Leute für 9600? Was ist die Einschränkung hier?


3
Zu Ihrer Information, der höchste Wert, den ein Arduino, der an USB angeschlossen ist, tatsächlich erreicht, ist 115200, und 57600 ist häufig der zweithäufigste Baud, den Sie sehen.
BrettAM

Antworten:


48

Warum lassen sich Menschen nieder?

Die Leute lassen sich nieder, weil es mehr als schnell genug ist. Die gebräuchlichste Verwendung ist nur das Drucken von Informationen auf einem Terminal zum Debuggen. 9600 Baud sind 960 Zeichen pro Sekunde oder 12 x 80 Zeichen pro Sekunde. Wie schnell kannst du lesen? :)

Wenn Ihr Programm die serielle Schnittstelle für die Übertragung von Massendaten verwendet, würden Sie sich dafür entscheiden, keine Einigung zu erzielen.

Was ist die Einschränkung ...

Die Grenzen der Seriennummer sind hoch. Direkt können Sie 115200 Baud in Ihren Programmen verwenden und es wird einfach funktionieren. Das Arduino-Terminal lässt maximal 115200 zu, aber andere Programme wie RealTerm lassen Sie höher laufen.

Die serielle Hardware läuft mit 1 MBaud. Wenn Sie herumlesen, werden Sie feststellen, dass Menschen durch direkte Steuerung des UART bis zu 1 M verbraucht haben. Sie können von hohen Baudraten profitieren, wenn Sie beispielsweise über einen Bluetooth-Chip senden. Wenn Sie die serielle Hardwareschnittstelle zum Austauschen von Chip zu Chip in kurzer Entfernung verwenden, ist 1 MBaud durchaus möglich. Denken Sie an alle SPI- und I2C-Geräte, die bei einer Taktrate von 1 MHz einwandfrei funktionieren.

Bei größeren Entfernungen treten Probleme mit Rauschen auf, wenn Sie die Signalisierung mit Logikpegel (einfach 0 bis 5 V) verwenden. Um größere Entfernungen zu nutzen, würden Sie einen Transceiver hinzufügen, um eine robuste Signalübertragung bereitzustellen, üblicherweise RS-232 und weniger häufig RS-485. Mit RS-232 könnten Sie ein Mega-Bit in Abständen von 10 Fuß laufen.

Die Taktrate des Mikroprozessors ist die tatsächliche Grenze. Bei einem Hardware-UART muss der Prozessor alle 10 Bits ein Byte in den UART laden (für N81). Wenn Sie also auf 1 MBaud kommen, wird es für den 16-MHz-Prozessor eine Herausforderung sein, den UART mit Daten zu versorgen. Ein neues Byte wird alle 160 Uhr-Ticks gesendet, was sehr wenigen Codezeilen entspricht. Für eine kurze Datenmenge können Sie diese Rate erreichen. Die Meldung lautet, dass dem Prozessor die Geschwindigkeit ausgeht, bevor der UART das Limit erreicht.

Beachten Sie, dass dies alles für HardwareSerial gilt , Software Serial ist sehr unterschiedlich.


Bitte beachten Sie, dass 2M mit hw serial archivierbar ist, aber die Implementierung von arduino zu langsam erscheint und viel Müll sendet. Sehen Sie sich atmega328p ds an, um das magische Bit zu finden, mit dem Sie Ihre Geschwindigkeit verdoppeln können. Hinzu kommt, dass 9800 Baud ein sehr alter Standard ist und viele Sensoren diesen Wert als Standard verwenden, auch wenn er für mehr konfiguriert werden kann, wie z. B. xbee, gps und mehr. Auch seriell über USB verwenden Auto-Baudrate Negotiation Hexe kann ausgewählte Baudrate überschreiben, aber ich denke, wird nicht von Arduino verwendet (aber es kann auf Leonardo sein)
Lesto

1
9600 8N1 ist auch eine De-facto-Standardeinstellung. Viele Geräte mit serieller Schnittstelle werden mit dieser Einstellung ausgeliefert und müssen konfiguriert werden, wenn eine andere Geschwindigkeit (oder Datenbits, Paritätsbit, Stoppbit) erforderlich ist.
Peter Mortensen

"es ist mehr als schnell genug" - Gute Antwort, aber mit diesem Punkt bin ich einigermaßen nicht einverstanden. Die meisten Implementierungen der Debug-Ausgabe sind blockiert, daher ist es sehr wünschenswert, die Debug-Ausgabe so schnell wie möglich zu gestalten, um übermäßige Änderungen in der Code-Ausführungszeit zu vermeiden.
Rev1.0

Wenn Sie Massendaten übertragen, würden Sie im Idealfall SPI verwenden, oder?
Tuskiomi

6

Neben all den interessanten Antworten muss erwähnt werden, dass das Einstellen der seriellen Geschwindigkeit auf XXX Bit / s nicht unbedingt XXX Bit / s auf der Hardware bedeutet.

Uhren - auch auf Quarzbasis - sind unvollkommen und können driften. Da der serielle Takt normalerweise durch einen Vor-Divisor-Zähler mit Zweierpotenz und einen (ganzzahligen) Zähler erzeugt wird, kann bei einer Basistaktfrequenz nicht jeder Wert genau erhalten werden. Mit Hilfe der Start- / Stopp-Bits kann eine asynchrone serielle Kommunikation gegenüber einer gewissen Taktverschiebung tolerant sein. Das hat aber Grenzen.

Wenn Ihr ATmega328PA beispielsweise mit 1 MHz betrieben wird, können Sie 9600 b / s bei 0,2% des Fehlers erzielen. Bei 14400b / s liegt der Fehler jedoch bei -3,5% (Kommunikation tatsächlich bei 13900b / s). Und bei 28800 b / s liegt der Fehler bei + 8,5% (Kommunikation tatsächlich bei 31200 b / s). Alle diese Angaben stammen aus dem Datenblatt ATmega48PA-88PA-168PA-328PA, S. 200 .

Dies ist kein Problem, wenn zwei identische Geräte miteinander kommunizieren (da sie tatsächlich mit derselben Geschwindigkeit kommunizieren ). Es könnte ein Problem sein , wenn zwischen verschiedenen Geräten zu kommunizieren.

Eine Erhöhung der Grundfrequenz ist nicht erforderlich, um die Genauigkeit signifikant zu verbessern. Wenn Sie beispielsweise den gleichen ATmega328PA wie oben bei 2 MHz betreiben, erhalten Sie keine besseren Ergebnisse, da dies hauptsächlich auf Rundungsfehler zurückzuführen ist. Der Betrieb mit 1,8432 MHz liefert sehr genaue Bps von 2400 b / s bis zu 57,6 kHz.


3

Ich denke, es ist eine Art Tradition, eine Übertragungsrate zu verwenden, die nicht die langsamste ist (300), aber auch keine, die in einigen Setups (28800 oder sogar 115200) Probleme verursachen kann. Die serielle PC-Schnittstelle (meistens ein FTDI232-USB-Adapter) kann höhere Raten verarbeiten, Ihre DIY-Hardware jedoch möglicherweise nicht. 9600 bps haben sich also als eine Art Standardübertragungsrate für Codebeispiele etabliert.


2

Damals war der "goldene Standard" für Remote-Tastaturen (mit einem Telefonmodem und Teletypen, wenn Sie sich an diese erinnern) 9600 Baud, was anfänglich nur über eine dedizierte Telefonleitung möglich war. Die Zeit vergeht langsam; technologische Fortschritte schnell; und das Gedächtnis bewegt sich noch langsamer als die Zeit (es scheint). Wir können routinemäßig mindestens über mehrere Meter mit einer Größenordnung von mehr als 9600 Baud kommunizieren. Was einst als Goldstandard galt, ist nicht mehr Gold, sondern wird immer noch als Standard angesehen.

tl; dr: Es ist Geschichte, keine Technologie.


0

Ich denke, der Hauptgrund, warum 9600 die meiste Zeit verwendet wird, ist, dass dies die Standard-Baudrate in der Arduino IDE ist. Auch schnellere Datenraten könnten unzuverlässig sein, wenn das serielle Signal einen langen Weg zurücklegen muss - obwohl ich keine Ahnung habe, warum dies als optimale Geschwindigkeit ausgewählt wurde.


-2

Menschliche Reaktionszeit

Da Benutzer in der Lage sein müssen, den seriellen Monitor anzuhalten, wenn Ihr Arduino über den Port läuft, ist es in 100% der Fälle erforderlich, dass die maximale Übertragungsgeschwindigkeit weniger als 100% der Fälle beträgt .

9600 Baud ist ein Kompromiss zwischen "einfach einen außer Kontrolle geratenen Prozess zu beenden" und "nervig langsam".


100% hey ... interessant;)
Angry 84
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.