Hallo,
ich lese GPS Daten von einem UP500 GPS Sensor und gebe die über UART auf
einem Arduino Uno wieder aus.
Es funktioniert soweit, allerdings sind die Ausgaben manchmal
verschoben:
gps schrieb:> // set the data rate for the SoftwareSerial port> mySerial.begin(38400);
Es ist recht mutig, eine Soft-Uart gleich mit 38400 fahren zu wollen. Da
kann es beim Buffer-Umschlagen schon mal eng werden, vor allem, wenn du
mit den Daten noch rummachst.
Du siehst ja selber, das was unvollständig ist, weil der kleine Kerl
noch am Rechnen war. Entweder schreibst du dir selber eine schnelle
Soft-UART, oder du tauschst die Schnittstellen, und fährst den PC Port
dann einfach langsamer.
Am sinnvollsten ist vermutlich ein MC mit 2 UART.
Ich könnte den GPS Sensor auf 19200 baud stellen.
Laut Doku:
$PMTK251,38400*27<CR><LF> Für 38400 --> 27 ist die Checksumme
Wie berechne ich die Checksumme für $PMTK251,19200 ?
Ah klappt, gerade rausgefunden.
Interessanter Effekt: Wenn ich die Baudrate vom Hardwareserial auf 19200
setze, ist die Ausgabe nicht mehr kaputt.
Wie kommt es`?
Du könntest erstmal etwas Klarheit in deiner Quelle schaffen.
In loop rufst du mySerial.read auf, nachdem du getestet hast, daß da was
zum Liefern vorliegt - und in readline tust du es ebenfalls, aber ohne
vorherigen Test.
Und Serial.write rufst du mal mit nem char und mal mit nem char* auf?
Sehe ich das richtig oder war das bloß einer der üblichen Tippfehler?
Eigentlich sehe ich den Zweck der ganzen Routinen nicht recht ein. Wird
da in den aufgerufenen Routinen gepuffert?
Und bei dem
"if (strncmp(buffer, "$GPRMC",6) == 0 || strncmp(buffer, "$GPGGA",6) ==
0)"
sehe ich eine heftige Zeitblockade.
Ich würde es anders machen:
1. für den Ausgangsstrom einen Ringpuffer einrichten
2. all sowas wir strncmp und Konsorten weglassen
immerzu:
SoftUART-Handler rufen
if TXfastleer und Ringpuffer nicht leer
dann Zeichen vom Ringpuffer zum TX transferieren
if RxhatZeichen dann Zeichen abholen
if Zeilenpuffer nicht voll, dann Zeichen in Zeichenpuffer tun
if Zeichen war CR dann
{ Zeilenpufferanfang zeichenweise testen,
wenn was nicht stimmt, Zeilenpuffer löschen und testen beenden.
Inhalt vom Zeilenpuffer in den Ringpuffer tun
Zeilenpuffer löschen
}
else Zeitausgleich falls Schleife zum Innenleben des Soft-UART gehört
goto immerzu;
etwa so ähnlich. Ist hier ja nur grob skizziert. Jedenfalls so, daß die
CPU immer in der Schleife herumrödelt OHNE sich irgendwo mit Warten auf
irgendwas aufzuhalten.
W.S.
Ich habe es noch pragmatischer gelöst:
C:\Program Files
(x86)\Arduino1.6.4\hardware\arduino\avr\libraries\SoftwareSerial\Softwar
eSerial.h
die Buffergröße von
#define _SS_MAX_RX_BUFF 64 // RX buffer size
auf
#define _SS_MAX_RX_BUFF 256 // RX buffer size
Jetzt gibt es keine Probleme mehr.
Kann man den Buffer auch innerhalb von einem Sketch ändern? Ich würde es
ungerne in der lib selbst ändern und vergessen...