2 serielle Schnittstellen mit dem 328

Hallo,

ich hab zwar schon das Forum durchsucht, aber irgendwie nix gefunden, was mir helfen könnte.
Folgendes Problem:
Ich habe ein Board mit einem ATMega328 (16MHz), SD, MPU6050 und 2 optogetrennten seriellen Schnittstellen.
Eine ist auf die Hardware Schnittstelle geroutet, die 2. soll/muss per SoftwareSeriell ausgelesen werden.
Beide Schnittstellen haben gleiche Parameter 4800,8N1. (Wobei die 1 auch mit 4800,9N1 betrieben werden können muss, ist aber jetzt hier nicht das Problem.)
Ich mußte dafür die HardwareSerial sowie auch die SoftwareSerial anpassen.
HardwareSerial: Unterstützung für 9X1 und getrennt einstellbare Puffer für Senden und Empfang, RX Buffer overrun, Puffer z.Z. RX 160, TX 8
SoftwareSerial: Nur Änderung der Puffergröße. RX 160

Es werden Datagramme mit max 80 Zeichen empfangen. Jedes ist mit CR LF abgeschlossen.
Die Datagramme sollen dann einfach auf eine SD Karte geschrieben werden. Dazu wird auch noch ein Zeitstempel geschrieben. (Nebenher werden auch noch Gyro und Acc Daten geloggt. Ist aber hier auch nicht das Problem.)

Das ganze Board läuft bereits, allerdings nur solange wie ich nur 1 Schnittstelle benutze. (Egal welche)
Sobald ich die 2 Schnittstelle dazu nehme, kommt es zu einem Buffer overrun und zwar auf beiden Schnittstellen.

Ich hab das ganze Problem auf einen kleinen Sketch eingegrenzt. Im Augenblick versuche ich jeweils einen Puffer leer zu bekommen, bzw. soweit zu leeren, daß ich ein Datagram fertig habe. Danach lese ich die 2. Schnittstelle aus.

Ich hab auch versucht, beide immer komplett zu leeren, (Also nicht Satzweise), oder immer pro Zeichen zu wechseln.
Die besten Ergebnisse (die wenigsten Fehler) habe ich mit dem satzweisen Lesen bekommen. Allerdings ist die Fehlerrate z.Z. noch erschreckend hoch. Teilweise >10%
Die Puffer kann ich nicht weiter erhöhen, weil ich sonst an die RAM Grenze stosse.

Jetzt meine Frage: Mach ich irgendwas falsch? Oder ist das einfach Zuviel für den Prozessor? Stören sich die Interrupts? Oder muss ich auf 2 Hardwareschnittstellen ausweichen. (z.B. mit 'nem 1284P)

HardwareSerial.h (4.79 KB)

HardwareSerial.cpp (15.9 KB)

TwoSerialTest.ino (2.55 KB)

willie1968:
Ich mußte dafür die HardwareSerial sowie auch die SoftwareSerial anpassen.
HardwareSerial: Unterstützung für 9X1 und getrennt einstellbare Puffer für Senden und Empfang, RX Buffer overrun, Puffer z.Z. RX 160, TX 8
SoftwareSerial: Nur Änderung der Puffergröße. RX 160

Meine Empfehlung: Die total schrottige SoftwareSerial aus Deinem Sketch rausschmeißen und durch die AltSoftSerial ersetzen:
http://www.pjrc.com/teensy/td_libs_AltSoftSerial.html

Und die existierenden Libraries unverändert lassen, sondern stattdessen eine Doppelpufferung programmieren: Definiere Dir im Sketch eigene Ringpuffer der benötigten Größe und lies die Zeichen immer beim Eintreffen aus dem standardmäßigen Eingangspuffer der Library in Deine eigenen Puffer im Sketch ein!

DANKE, die fehlte mir...

Naja,
die Änderungen in der HardwareSerial brauche ich ja trotzdem. Alleine schon wegen dem 9N1. Und der neue Ringpuffer ist auch nicht schlecht. Vor allem, weil man eben die Größen für Senden und Empfangen unterschiedlich einstellen kann. Ich muss z.B. überhaupt nicht senden, den Speicher für den Puffer kann ich als RAM anderswo besser gebrauchen. Doppelpuffer hab ich ja.

Nun aber das Beste.

  1. Ich hab zufällig genau die richtigen Pins im Layout verwendet. 8)
  2. ich habe gerade mit dem kompletten Paket ein paar Tests gefahren. Ich komme auch folgende Werte:

File: DATA0002.DAT, found 0 errors (0,0%) in 2240 datagramms.
File: DATA0003.DAT, found 0 errors (0,0%) in 560 datagramms.

:grin: So und jetzt schmeiss ich den Nachttest an...