GPS NMEA über SPP Übertragen mit zusätzlichen Daten

Hi ich glaube ich steh aktuell was auf dem Schlauch ....

Ich hab ein Ublox N8M GPS Modul an meinem ESP32 angeschlossen und übertrage die Daten über Bluetooth Serial.

Zusätzlich zu den NMEA Sätzen möchte ich für die Racechrono App noch sogenannte RC3 Sätze übermitteln.

Mein code ist:

if (gpsProv.gpsPort->available())
  {
    size_t len = gpsProv.gpsPort->available();
    uint8_t sbuf[len];
    Serial.println(len);
    gpsProv.gpsPort->readBytes(sbuf, len);
    btProv.SerialBT.write(sbuf, len); // Senden des Abschnitts vom GPS Modul

    uint8_t checksum = 0;
mycounter++;
      char buffer[255];
      sprintf(buffer, "RC3,%s,%d,%lu,%s,%s,%s,%s,%s,%s,%s,%d,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s",
              "",
              mycounter,
              random(1, 100),
              "-0.560",
              "-0.290",
              "7.938",
              "-0.125",
              "0.063",
              "",
              "",
              "",
              "-40.438",
              "2.625",
              "70.875",
              "9.875",
              "-48.250",
              "-6.360",
              "-0.340",
              "7.450",
              "-6.100",
              "-0.940",
              "7.170",
              "0",
              "1",
              "10");

      int lenght = strlen(buffer);
      for (int i = 0; i < lenght; i++)
      {
        checksum = checksum ^ (uint8_t)buffer[i];
      }

      btProv.SerialBT.printf("$%s*%X\r\n", buffer, checksum); //Senden des RC3 satzes
}

Das Problem ist, dass die RC3 Sätze in mitten des NMEA Satzes hinzugefügt werden. (Mir ist klar warum und das ist der Grund warum ich auf dem Schlauch stehe).

Ich muss irgendwie den Prozess unterbrechen wo der ESP die NMEA Sätze abschickt. Ich muss beim CR und LN unterbrechen, meinen Rc3 Satz absenden und dann ganz normal mit NMEA weiter machen.

Jemand ne Ahnung wie?

Hallo
Wer sendet was, wann und wohin ?

GPS Modul sendet mit einer 10Hz Rate Daten an den ESP.

Diese werden Stück für Stück empfangen und genauso über Serial BT vom ESP an mein Android Handy geschickt wo Racechrono drauf läuft.

Die kompletten Sätze sehen z.B. wie folgt aus:
$GPGGA,172814.0,3723.46587704,N,12202.26957864,W,2,6,1.2,18.893,M,-25.669,M,2.0,00314F
$RMC,172814.0,3723.46587704,N,12202.26957864,W,2,6,1.2,18.893,M,-25.669,M,2.0,0031
4F

Wichtig: Diese werden jedoch Stück für Stück über Serial BT gesendet und am Empfänger ergibt das wieder einen kompletten Datensatz

(Klappt ohne Probleme)

Zusätzlich zu den NMEA Sätzen soll ein $RC3 Datensatz gesendet werden.
Der sieht wie folgt aus:

$RC3,,14,27,-0.560,-0.290,7.938,-0.125,0.063,,,1061312368,-40.438,2.625,70.875,9.875,-48.250,-6.360,-0.340,7.450,-6.100,-0.940,7.170,0,1,10*12

Das Problem ist, dadurch das NMEA Stück für Stück gesendet wird, quetsche ich aktuell den RC3 Datensatz irgendwann einfach dazwischen wodurch die Daten dann nicht mehr richtig sind.

Dann schau doch das letzte Byte vom sbuf an und nur bzw genau dann wenn es \n ist klemmst Du den RC3 dazwischen

Das wäre doch zu einfach.

"\n" kann im sbuf ja auch mitten drin sein.

Dann durchlaufe den Puffer und suche das '\n' oder benutze strchr.

Gruß Tommy

Dann müsste ich read statt Readbyte durchführen... okay.

Wenn ich aber dann Serial BT.print sbuf mache dann kann RaceChrono das nicht mehr auswerten. Also ist der Char array irgendwie nicht mehr in Ordnung

Gib uns Deinen Sketch und wie die Daten aussehen.
Das ganze Drumrumraten bringt nichts.

Gruß Tommy

Der Code welche die Daten versendet ist oben bereits gepostet und wie die Daten aussehen ist ebenfalls gepostet

Die Frage wäre dann mit welcher Baudrate das GPS angekoppelt ist. Wenn das schnell genug ist...
Bei 10Hz und geschätzten 130 Byte für die beiden NMEA-Records gibt es doch eine hohe Wahrscheinlichkeit dafür, dass es eine Lücke gibt: Das Ende von sbuf ist das Ende eines Records und es ist weiter kein Zeichen vom GPS eingetroffen.

Das Gps ist mit einer Baud von 115200 verbunden.

Hab mir mal im Log die Länge von sbuf ausgeben lassen und diese ist immer ca. 15 Zeichen lang

Hab soeben "ReadBytesUntil" gefunden und das macht ja fast genau das, was ich suche.

Schön wäre es wenn ich damit herausfinden könnte, ob in meiner Len mein Trennzeichen drin ist oder nicht, da die Funktion mehrere Abbruchbedingungen hat.

Ist nicht so schwer das herauszufinden:

Die Funktion bricht ab (Überprüfungen werden in dieser Reihenfolge durchgeführt), wenn die ermittelte Länge gelesen wurde, wenn die Zeit abgelaufen ist (siehe Serial.setTimeout()) oder wenn das Terminatorzeichen erkannt wurde (In diesem Fall gibt die Funktion die Zeichen bis zum letzten Zeichen vor dem angegebenen Terminatorzeichen zurück). Das Terminatorzeichen selbst wird nicht im Puffer zurückgegeben.

Danke Walter,

Doku lesen kann ich auch

Okay, verstanden.
Und tschüß!

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.