Ich möchte in einem Projekt bei dem ich momentan ein Arduino MEGA verwende auf den Uno wechseln.
Dabei muss ich die zweite serielle Schnittstelle des MEGA auf eine Software Serial Schnittstelle umstellen.
Jetzt stellt sich die Frage wie zuverlässig die Software Serial arbeitet.
Die Schnittstellen sind auf 9600 Baud eingestellt Wie ist da das Zeitverhalten wenn in der Prozessor mit aufwendigen Berechnungen ausgelastet ist.
Läuft man da Gefahr das Daten verlorengehen oder sind die Interrupt-Routinen der Software Serial Lib so gut das die Schnittstelle bei der relativ geringen Geschwindigkeit trotzdem sauber arbeitet.
Das verwendet einen Timer und geht damit besser. Geht damit auch nur auf Pins 8 und 9
Da steht auch:
NewSoftSerial (SoftwareSerial in Arduino 1.0 & later) - Can have multiple instances on almost any pins, but only 1 can be active at a time. Can not simultaneously transmit and receive. Can interfere with other libraries or HardwareSerial if used at slower baud rates. Can be sensitive to interrupt usage by other libraries.
...
However, the maximum baud rate is often not the most important question. Each library imposes interrupt latency on other libraries. AltSoftSerial causes approximately 2-3 µs latency. NewSoftSerial causes 10 bit times of latency for other libraries. Running at 57600 baud, that's 174 µs! This latency is the primary difference between AltSoftSerial and NewSoftSerial.
To see this in action, you can try the example that comes with SoftwareSerial in Arduino 1.0. If you type "Goodnight" in the Arduino Serial Monitor, you'll see what actually comes out of pin 3 at 4800 baud is "Goot". The characters "dnigh" are lost. The reason is because while SoftwareSerial is sending the letter "G" at 4800, the letters "oodnigh" arrive at 57600 baud. Only "oo" are held in the UART registers. The rest are lost because interrupts were disabled for too long. AltSoftSerial can handle this test easily, since it does not lock out interrupts for long times.
...
Because NewSoftSerial creates 10 bit times of latency for other libraries, it should be used for a device needing high baud rate. NewSoftSerial should NOT be used at slow baud rates, because it will interfere with the other ports. NewSoftSerial can not simultaenously transmit and receive, so it should be used with a device that never sends in both directions at once.
Das Hauptproblem ist also nicht die Baudrate, sondern wie anfällig die Lib für Interrupts anderer Libs ist und dass NewSoftSerial selbst viel Zeit braucht.
Bitpfriemler:
Welche Erfahrungen habt Ihr gesammelt?
SoftwareSerial ist Schrott.
Bei allen von mir durchgeführten Tests hat AltSoftSerial stets hundertmal besser performt als SoftwareSerial.
Ich kann nur AltSoftSerial empfehlen.
Kann dem nur zustimmen. Hatte bei einem Projekt auch die Möglichkeit gesucht, eine zusätzliche Serielle Schnittstelle aufzubauen für ein BT-Modul. Zu gefühlten 100% hat nur die AltSoftSerial funktioniert. Die andern haben immer wieder Fehler projeziert.
Ob eine Serielle Schnittstelle Daten verliert hängt vom Buffer ab Ist dieser Voll ohne daß er geleert wird gehen Daten verloren. Dies unabhängig ob HW oder SW emulierte Schittstelle.
Es ging dabei nicht um verlorene Daten. Es handelt sich mehr darum, dass sich der µC teils aufhing oder aber kyrilsche Zeichen vereinzelnt schickte. Gleicher Sketch mit der AltSoft machte keine Mucken.
Bitpfriemler:
...
Läuft man da Gefahr das Daten verlorengehen oder sind die Interrupt-Routinen der Software Serial Lib so gut das die Schnittstelle bei der relativ geringen Geschwindigkeit trotzdem sauber arbeitet.
...
Die Schnittstellen sind auf 9600 Baud eingestellt Wie ist da das Zeitverhalten wenn in der Prozessor mit aufwendigen Berechnungen ausgelastet ist.
Läuft man da Gefahr das Daten verlorengehen oder sind die Interrupt-Routinen der Software Serial Lib so gut das die Schnittstelle bei der relativ geringen Geschwindigkeit trotzdem sauber arbeitet.
Das Problem bei der SoftwareSerial-Implementation ist weniger, dass diese Schnittstelle Daten verliert (das tut sie höchstens, weil das Zeitverhalten nicht super-präzise ist), sondern, dass sie den Prozessor für relativ lange Zeit komplett blockiert, während sie Daten empfängt oder verschickt (inkl. Interrupts). Wenn also öfters Daten über die SoftwareSerial-Schnittstelle übertragen werden, kann es sein, dass Daten auf der HardwareSerial-Schnittstelle verlorengehen (kommt zwar eher seltener vor) oder dass Deine Berechnungen keine Rechenzeit auf dem Prozessor mehr kriegen.
SoftwareSerial ist als Notfall-Lösung geeignet, wenn 1. selten Daten darüber übertragen werden und 2. die Gegenseite eher tolerant ist, was das Timing angeht. In allen anderen Fällen rate ich dringend, eine Hardware-Implementation zu verwenden oder (falls das nicht geht) auf eine etwas bessere, dafür eingeschränktere Implementation wie AltSoftSerial (wurde ja von anderen schon empfohlen) zu setzen.