mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik GPS Datensatz einlesen


Autor: Franki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen,

ich auf einem Embedded-PC die serielle Schnittstelle jetzt zum Laufen 
gebracht. Eine Methode ist die CheckForFrame. Damit kann ich prüfen wann 
das Ende mit dem Zeichen 'z' erreicht wurde. Die ReceiveCallBackFunc 
Methode beinhaltet das ganze Frame.
int COMchild::CheckForFrame(char* buf, int len)
{
        if (len == 100)
  {
    if(buf[99]=='z')
    {
        return 1;
    }
  }
  return 0;
}

void COMchild::ReceiveCallBackFunc(void* _pthis)
{
  int i;
  COM *pthis= (COM*)_pthis;
  char value[100];
  
  for (i=0; i<RX_BUFFER_SIZE;i++)
    {
      value[i] = pthis->rxbuffer[i];
    }
}

Jetzt hab ich eine GPS Maus angeschlossen.
Ich möchte nun die einzelnen Datensätze einlesen. Wie kann ich dies 
realisieren? Das Problem ist, ja, das die einzelnen Datensätze 
unterschiedlich lang sind.

Autor: Franki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hoffe ich hab mich verständlich ausgedrückt!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nicht wirklich

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beide Funktionen gefallen mir nicht.

In COMchild::ReceiveCallBackFunc sehe ich Probleme bei RX_BUFFER_SIZE > 
100, dem Abschliessen mit Nullbyte, dem Verlust von value beim Verlassen 
der Funktion sowie dem Brute-Force-Kopieren ungeachtet der tatsächlichen 
Eingabelänge im rxbuffer. Abgesehen davon, dass Platz für pthis 
verschwendet wird.

In COMchild::CheckForFrame gefällt mir die erste Prüfung auf 
Vollgeschriebenen buf über len==100 nicht. Das wäre auch der erste 
Punkt, der weg müsste, wenn die Zeilen unterschiedlich lang sind.

Um genauere Vorschläge zu machen, bräuchte man mehr Infos zum 
Programmcode. Rel. einfach wäre es wenn z.B. in rxbuffer immer komplette 
Zeilen (bis Zeilenende \n) stehen und dann COMchild::ReceiveCallBackFunc 
aufgerufen würde. Ich würde dann die Funktion aufblasen:
int COMchild::ReceiveCallBackFunc(void* _pthis, char* dest_line, size_t max_dest_len)
{
  // Anzahl Zeichen im Zeileneingangspuffer+Nullbyte > max_dest_len
  // oder dest_line == NULL oder _pthis == NULL
  // return 0;

  // Zeichen im Zeileneingangspuffer+Nullbyte nach dest_line kopieren
  // return Anzahl Zeichen im Zeileneingangspuffer+Nullbyte;
}

Mit den Daten daraus kannst du dann schon die Zeile prüfen
int COMchild::CheckForFrame(char* buf, size_t len)
{
   // Aufruf:
   // an buf wird dest_line übergeben
   // an len wird Anzahl Zeichen im Zeileneingangspuffer+Nullbyte übergeben

   // wenn len == 0 oder buf == NULL
   // return UNGUELTIG

   // Erweiterung:
   // wenn Anfang gleich $GRABC
   return IST_ABC_FRAME;

   // Erweiterung:
   // wenn Anfang gleich $GRXYZ
   return IST_XYZ_FRAME;

   // Erweiterung:
   // Nix erkannt...
   return IST_UNBEKANNTER_FRAME;
}

Mit den FRAME_TYPEN könnte man dann eine Framezerschnippelfunktion 
triggern, die die interessanten Daten aus den unterschiedlichen Frames 
herausholt (Länge, Breite, Anzahl der Sats, Zeit...)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Franki wrote:
> Ich hoffe ich hab mich verständlich ausgedrückt!

Nicht wirklich

Welche spezielle Bedeutung spielt das 'z'?

> Ich möchte nun die einzelnen Datensätze einlesen. Wie kann ich
> dies realisieren? Das Problem ist, ja, das die einzelnen
> Datensätze unterschiedlich lang sind.

Ist das ein NMEA Protokoll?

Die Datensätze fangen mit '$' an und laufen bis zu einem CR/LF
Sobald ein '$' auftaucht, alle weiteren Zeichen bis zum
CR/LF in einem Buffer sammeln, das CR/LF bleibt aussen vor,
noch ein '\0' dahinter und du hast einen ganz normalen C-String,
den du mit den C Stringfunktionen (strcpy, strcat, strtok, etc)
weiterverarbeiten kannst.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.