SoftSerial Baudraten - was geht wirklich?

Hallo,

ich probiere gerade ein wenig herum mit der SoftSerial (die Version aus IDE 1.0.6 bzw. 1.5.8 ) und möglichen Baudraten.
Wirklich zuverlässig geht das hier im Moment nur bis 19200 Baud.
Andererseits steht z.B. auf der Arduino Seite daß wohl bis 115k möglich sind:
SoftwareSerial

Liegt das “nur” am ungenauen Resonator des vorliegenden Board?
Wie sind Eure Erfahrungen diesbezüglich?

AltSoftSerial macht zwar die gewünschten 57600baud am selben Board problemlos - nur ist sie mir auf Pin8 und 9 etwas ungelegen…

Christian

Resonator ist schon mal "schlecht" gewählt. Nimm besser Quarz.
SoftSerial ist eigentlich bekannt, dass man da die Pins frei wählen kann?!
Theoretisch, wenn in der Beschreibung 115K steht, kannst die auch nutzen.
Klar ist jedoch, je höher desto fehlerhafter.
Frage ist jedoch, brauchst du die 115K? 19K müssten auch schon reichen, da brauchst dir auch keine Fragen wegen den 115K zu stellen.
Zum testen, wie du im Post angegeben hast, reichen auch 1K, Standart ist jedoch 9K (9600).

Hallo,

hmm, ich habe es wohl schlecht formuliert, beim "Testen" geht es mir nicht um die prinzipielle Funktion, die einwandfrei gegeben ist, sondern vor allem um das Verhalten mit höheren Baudraten, speziell auch 57k6.

Die Pins kann man mit SoftSerial frei einstellen, aber wohl nicht mit AltSoftSerial. Andererseits gehen mit AltSoftSerial die 57k6 und auch 115k (zumindest TX) aber eben nur fix auf Pin 8 und 9. :confused:

Jetzt habe ich auch noch probiert auf meinem alten Duemilanove Board (mit Quarz, aber schon mit Uno Bootloader): völlig identisches Verhalten.

Christian

elektron_:
ich probiere gerade ein wenig herum mit der SoftSerial (die Version aus IDE 1.0.6 bzw. 1.5.8 ) und möglichen Baudraten.
Wirklich zuverlässig geht das hier im Moment nur bis 19200 Baud.
Andererseits steht z.B. auf der Arduino Seite daß wohl bis 115k möglich sind:
SoftwareSerial

Liegt das “nur” am ungenauen Resonator des vorliegenden Board?

Nö, die Ungenauigkeit des Resonators führt bei HardwareSerial zu genau denselben Ungenauigkeiten wie bei bei SoftwareSerial.

Was die Grenze bei SoftwareSerial setzt, ist hauptsächlich die Verwendung von Software-Interrupts im System.

So funktioniert nach meiner Erfahrung SoftwareSerial bereits dann bei keiner einzigen Baudrate mehr völlig einwandfrei, wenn HardwareSerial gleichzeitig mit einer Baudrate von nur 9600 Baud auf Dauerempfang verwendet wird. Oder Servos gleichzeitig gesteuert werden. Oder eigene Timer mit hoher Timer-Interruptrate laufen, zum Beispiel beim Sampling von Drehgebern.

Und SoftwareSerial funktioniert um etliche Größenordnungen schlechter als AltSoftSerial, weil die von SoftwareSerial selbst verwendeten Interrupts so lahm laufen: Weil SoftwareSerial auf beliebigen Pins laufen kann, werden fürchterlich ineffektive Routinen mit langen Laufzeiten verwendet, was zu langsamer Interruptausführung führt. So dass viele andere auftretende Interrupts die Interruptverarbeitung noch viel mehr stören als die viel schneller abgearbeiteten AltSoftSerial-Interrupts.

Wenn Du Serial benötigst, dann verwendest Du

  • am besten und sichersten HardwareSerial
  • danach AltSoftSerial
  • und wenn es gar nicht anders geht im Notfall SoftwareSerial

Außer Du kannst mit hohen Fehlerraten bei der Übertragung gut klarkommen.

Hallo,

hmm, das mit den anderen Interrupts ist irgendwie verständlich, aber es geht hier nicht einmal mit einem Minimal-Sketch. Probiert mit mehreren Arduino Boards (Uno/Mini-Pro-Clone,Duemilanove) und mehreren Ser. Schnittstellen (original Com mit Max232, Silabs,…

Bis 19200 ist es egal, darüder geht nur AltSoftSerial. Wenn es wirklich nicht gehen sollte, warum schreibt man dann “offiziell” 115k???

Irgendwie denke ich daß da noch ein anderes Problem ist…

//#include <SoftwareSerial.h>
//SoftwareSerial softSerial(8, 9); // RX, TX

#include <AltSoftSerial.h>
AltSoftSerial softSerial;

void setup() {
 
  pinMode(13, OUTPUT);
  softSerial.begin(57600);
}

void loop() {
  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  softSerial.println (F("Ein"));
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  softSerial.println (F("Aus"));
  delay(1000);              // wait for a second
}

Christian

elektron_:
hmm, das mit den anderen Interrupts ist irgendwie verständlich, aber es geht hier nicht einmal mit einem Minimal-Sketch. Probiert mit mehreren Arduino Boards (Uno/Mini-Pro-Clone,Duemilanove) und mehreren Ser. Schnittstellen (original Com mit Max232, Silabs,...

Bis 19200 ist es egal, darüder geht nur AltSoftSerial. Wenn es wirklich nicht gehen sollte, warum schreibt man dann "offiziell" 115k???

Was schließt Du denn als Adapter-Hardware an die emulierte serielle Schnittstelle an?

Und mit was für einem Kabel mit welcher Länge werden die Daten dann wohin übertragen?

Wenn Du z.B. einen RS232-Adapter anschließt und ein 20m langes RS232-Kabel, dann ist auch 19200 die höchste Baudrate, die über ein RS232-Kabel auf 20 Meter Länge unterstützt wird.

Die 115200 Baud dürften nur gelten für den Anschluß eines USB-TTL-Adapters, und wenn Du die Daten dann mit einem USB-Kabel von maximal 5m Länge zu einem PC überträgst.

Maximale Kabellänge USB: 5m, unabhängig von der Baudrate
Maximale Kabellänge RS232: Abhängig von der Baudrate, z.B. 20 Meter mit max. 19200 Baud.

Einen USB-TTL-Serial Adapter hätte ich wohl irgendwo in der Bastelkiste und könnte damit die maximale Datenrate austesten.

Bei RS232-TTL-Serial Adaptern kommt es in ganz hohem Maße auf

  • die Kabellänge sowie
  • die Qualität und Abschirmung des Kabels
    an, welche Datenrate Du per Serial generell einwandfrei übertragen kannst.

Edit/Nachtrag:
Der von Dir oben gepostete Sketch funktioniert mit SoftwareSerial.h und 115200 Baud bei mir völlig einwandfrei auf einem Arduino UNO. Und zwar sowohl auf einem älteren UNO mit Schwingquarz wie auch auf einem kompatiblen R3 UNO mit Resonator. Angeschlossene Hardware: USB-TTL Adapter mit PL2303HX Chip (China-Ware, ca. 1,70 EUR), angeschlossen an einem Windows-7 PC mit dem Programm "Putty" auf der Empfangsseite.

Hallo,

vielen Dank für die Hilfe,

die Idee mit dem Kabel war gut, aber letztendlich auf ca. 10cm reduziert (CP2102 USB-TTL direkt am Notebook, ~10cm Drähtchen zu den Boards...)

Aber: Ich bin mir ziemlich sicher daß sich hier irgendwie die uralte (vor UNO1.0.0) SoftSerial Lib eingeschlichen hat. Ich habe jetzt die IDE 1.0.6 komplett neu heruntergeladen / Installiert und siehe da, auf einmal geht es. Dort ist der Sketch dann auch 3.574 Bytes groß. Mit der IDE 1.5.8 (auch gerade neu Installiert) hat der Sketch blos 3.318 Bytes. Und es geht nicht.

Interessant wäre jetzt noch:
Ist in der IDE 1.5.8 tatsächlich die ganz alte SoftSerial enthalten? Hat das irgend einen tieferen Grund oder ist das nur ein kleiner Bug in der Betaversion?
Was ging bei der IDE1.0.6 kaputt daß plötzlich eine schlechte Lib verwendet wird? Ruiniert etwa die Installation von 1.5.8 die anderen Installationen?

(Läuft hier alles noch auf XP da ich für den "Bastelrechner" schlicht und ergreifend noch keine 7 Lizenz habe, vielleicht ist das der Grund :blush: )

Christian

elektron_:
Ich habe jetzt die IDE 1.0.6 komplett neu heruntergeladen / Installiert und siehe da, auf einmal geht es.
Dort ist der Sketch dann auch 3.574 Bytes groß. Mit der IDE 1.5.8 (auch gerade neu Installiert) hat der Sketch blos 3.318 Bytes. Und es geht nicht.

Ich habe die 115200 Baud mit SoftwareSerial unter Arduino 1.0.5 getestet.
SoftwareSerial wurde seinerzeit für die 1.0.x Versionen entwickelt.

Grundsätzlich ist es so, dass die Arduino-IDE die Programme “auf Größe optimiert” und die Optimierungsparameter sind fest eingestellt. Bei den Betaversionen 1.5.x wurde die IDE vor einigen Wochen auf eine neuere GCC-Compilerversion umgestellt, die anderen Code erzeugt und kleineren Code erzeugt. Also die Programmgröße wird besser optimiert.

Im allgemeinen stehen die Optimierungen “auf schnellen Code” und “auf kleinen Code” im Widerspruch, d.h. auf Kleinheit optimierter Code läuft oft langsamer. Das kann bei zeitkritischen Libraries natürlich zum Problem werden.

Dein Problem dürfte also nicht sein, dass die IDE 1.5.x eine andere SoftwareSerial mitbringt als die 1.0.x IDE, sondern das Probllem liegt darin, dass die Library unverändert übernommen wurde, aber der Compiler anders optimierten Code mit einem abweichenden Laufzeitverhalten daraus erzeugt. So dass ggf. das Timing unter 1.5.x Betaversionen des Compilers nicht mehr für 115200 Baud reicht.

Alleine daran kannst Du auch erkennen, dass AltSoftSerial die bessere Wahl gegenüber SoftwareSerial ist: Die Library AltSoftSerial läuft auch mit der neuen Compilerversion mit hohen Baudraten einwandfrei.

Der Wartecode in SoftwareSerial ist zwar in Assembler codiert, aber bei höheren Geschwindigkeiten spielt der Rest des Codes eine immer grössere Rolle. Bei 115kbaud wird die Warteschleife gerade noch einmal pro Bit durchlaufen, der Rest entfällt auf das Bitschieben und Pointer inkrementieren, etc.
Selbst mit der IDE 1.0.6 kriegst Du keine halbwegs zuverlässigen 115200 Baud mit der Bibliothek hin, die zeitlichen Abweichungen sind enorm. Nur mit einem äusserst tolerante Gegenüber kannst Du mit dieser Geschwindigkeit noch kommunizieren.

Wie bereits weiter oben mal erwähnt wurde, verwende die SoftwareSerial-Bibliothek nur im Notfall. Wenn immer möglich, solltest Du die serielle Schnittstelle in Hardware bevorzugen. Zur Not kann die SoftwareSerial-Bibliothek bis ca. 9600 Baud verwendet werden, alles darüber funktioniert wohl eher zufällig und nur wenn die Gegenstelle sehr viel Aufwand betreibt, das zeitliche Verhalten abzustimmen.

Die SoftwareSerial-Bibliothek ist auch bekannt dafür, dass sie andere Komponenten beeinträchtigt. Dies, weil sie ausgiebig von Interrupt-Sperren Gebrauch macht, was alle anderen zeitkritischen Komponenten gar nicht schätzen.

Hallo,

vielen Dank für die Infos. Klar, die Softserial ist nur ein Kompromiss die viel CPU Leistung "frißt". Trotzdem gibt es Anwendungen wo diese Lösung durchaus interessant ist.
Das mit den Optimierungsoptionen vom Compiler klingt auch irgendwie logisch. Könnte das auch der Grund gewesen sein daß es auf einmal auch mit IDE1.0.6 nicht mehr wollte? Ich hätte aber nicht bewußt irgendwo herungefummelt...

Christian

Als Kompromiss würde ich das nicht sehen. Fehlt mir in einem Projekt die ein oder andere UART oder I2C Schnittstelle, dann wurde vorab der falsche Controller gewählt.

Wenn der Mega2560 nicht für einen nicht lötbar oder zu teuer ist, dann ggf. auf den ATMega164/324/644/1284 umsteigen. Dort gibt es 2 Hardware UART Schnittstellen. Wird mit Addons auch von Arduino unterstützt.

Habe die Software Serial nie gemocht, auch nicht als Notlösung. Die AltSoftSerial ist da schon deutlich stabiler. Des weiteren sollte man immer abwägen, welche Geschwindigkeiten man bei UART benötigt. Nur weil man 115k könnte, heißt das nicht, dass es die beste Wahl ist. 9600 ist eine gute Wahl für fast alle Anwendungen, bei denen nicht unnötigt Zeichen gesendet werden.

hi,

in beiden punkten absolut Deiner meinug. wenn ich 2 serials brauch, dann den 1284er. ein 328 kostet 2 euro, der 1284 4 euro. ohne platzprobleme oder großserienpläne ist das keine frage.
obwohl ich zugeben muß, zu planen, in zukünftigen platinen die altsoftserial als debug-schnittstelle zu verwenden. aber auch nur dafür.
und mehr als 9600 ist selten nötig, außer es geht um echten datentransfer (boblight oder ähnliches).
von den preisen her ist es ja so, daß es nicht um die größe oder die skills geht, sondern um die gebräuchlichkeit, und da sind der der 328 und der 1284 die einzigen interessanten (eventuell noch der atmega8 um 1,50, aber der ist aus einer anderen serie, da geht dann manches nicht, oder nicht leicht).

ich bin einfach schon zu faul, um 3 tage in einen prozessor zu investieren, damit ich dann einen euro spar.

gruß stefan