SoftwareSerial read mit115200?

In der Doku lese ich

It is possible to have multiple software serial ports with speeds up to 115200 bps

Ich habe auf einem Original Uno versucht, auf Pin 2 etwas zu lesen, bekomme aber bei 115200 oft falsche Zeichen.

Hab das Ganze jetzt soweit vereinfacht, dass ich mit SoftwareSerial nur lese und auf Serial protokolliere. Zum Test nutze ich eine 1 cm Drahtbrücke zwischen Pin0 und Pin2 und den SerialMonitor. Einzelne Zeichen sind ok, bei mehreren treten Fehler auf.

#include <SoftwareSerial.h>
SoftwareSerial s(2,-1);  // Read only

void setup() {
 Serial.begin(115200);
 Serial.println(F("SoftwareSerial Rx=2 receive only Testing 115200"));
 s.begin(115200);
s.listen(); // Nachtrag: Bringt keine Verbesserung
}

void loop() {
  if(s.available()) { Serial.print( "2 :");Serial.println(s.read(),HEX); }
  if (Serial.available()) { Serial.print( "0 :");Serial.println(Serial.read(),HEX); }
}

SoftwareSerial Rx=2 receive only Testing 115200
12:15:41.463 -> 0 :48
12:15:41.463 -> 2 :48
12:15:41.463 -> 0 :65
12:15:41.463 -> 2 :59
12:15:41.463 -> 0 :6C
12:15:41.463 -> 2 :8B
12:15:41.463 -> 0 :6C
12:15:41.463 -> 2 :EB
12:15:41.463 -> 0 :6F
12:15:41.463 -> 2 :FB

(Eingabe "Hello")

Bei 57600 geht's übrigens noch gut.

Wie ist der Satz in der Doku mit den 115200 zu verstehen?
Was überfordert hier den armen Uno?
...frag ich mal ganz dumm...

Hatte mich da auch mal eingelesen und ein bisschen herumgetestet.
Das Ergebnis war bei meinem Nano genauso: 57600 liefert verlässliche Daten, mehr macht gerne Probleme.
Habe nun seit ein paar Jahren verschiedenste Bluetooth-Module im 57600er Betrieb und alles kommt sauber an.

Den angesprochenen Parallelbetrieb ("Multiple Serial Ports") kann ich nicht bestätigen. Wenn der SoftSerial1 nicht beendet ist, kann ich mit SoftSerial2 nix senden und mit 1 weiter empfangen.
Da ich aber keine Überschneidungen vom Timing her habe, beende ich, sende Daten über den 2. und starte wieder den ersten Port.

Mehr sollte auch gar nicht gehen...
Im Changelog von NewSoftwareSerial heisst es:

und weiter unten:

Wenn ich das richtig verstehe, dann geht 115K nur mit 20Mhz.

http://arduiniana.org/libraries/newsoftserial/

Das ist Marketing :slight_smile:
Sie können 115200 handhaben, wenn die payload kurz ist, ihre Frequenz niedrig ist und Sie nicht viel mehr im Code tun.

Wenn Sie anfangen, einen Heavy-Duty-Code zu haben, kann es aufgrund von ISR-Konkurrenz tatsächlich zu einem Problem werden, über 9600 hinauszugehen

Ich würde SoftwareSerial in keiner Anwendung über 9600 Baud verwenden. zB Wenn Sie also ein Modul haben, dessen Standardbaudrate 115200 ist und Sie es ändern können, würden Sie dies im Setup tun

#include <SoftwareSerial.h>
SoftwareSerial s(2,3);

void setup() {
  s.begin(115200);
  s.print("AT+CHANGEBAUD=9600"); // was auch immer der richtige befehl ist
  s.flush();
  s.end();
  s.begin(9600);
}

Wirds besser wenn du auf der HW Seriell schneller schreibst als du von Softserial liest?

Ja. Je weniger Zeit Sie in die ISR blockiert sind, desto wahrscheinlicher ist es, dass Sie keine SoftwareSerial-Unterbrechung verpassen

Das würde ich so pauschal nicht sagen. Wie bereits geschrieben, läuft es bei mir absolut verlässlich auf 57600 Baud.
Allerdings handelt es sich in meinem Anwendungsfall um ein Anfrage-Antwort Protokoll. Entsprechend wird gelesen, dann Berechnungen gemacht und schlussendlich geschrieben. Nix parallel.

s.print("AT+CHANGEBAUD=9600"); // was auch immer der richtige befehl ist

Hier hoffe ich mal auf Sarkasmus.
Kenne da noch mindestens drei weitere Befehle, die das selbe bewirken:

s.print(F("AT+BAUD7"));
delay(1000); //No CR + LF, but wait 1sec

s.println(F("AT+UART=57600,0,0"));

s.println(F("AT+BAUD7"));

AT+CHANGEBAUD=9600 war nur eine reine Erfindung :slight_smile: