GPS an µC: NMEA auswerten

Gast #520492
Lesenswert?

Hallo,

ich möchte gerne GPS Daten mit einem µC auswerten, eigentlich nur 
Geschwindigkeit
Ich habe mal etwas rumgeschaut und festgestellt, dass GPS Mäuse 
unterschiedlicher Hersteller bei den PS/2 Steckern unterschiedliche 
Belegungen haben, also werde ich den Anschluß per USB Stecker machen, in 
der Hoffnung, dass da die 4 Pins gleich belegt sind.

Aber zu meiner eigentlichen Frage. Ich möchte die mittels NMEA-Protokoll 
eintreffenden Daten auswerten, am besten wohl den $GPRMC Datensatz, weil 
da neben der Geschwindigkeit auch noch andere schöne Infos enthalten 
sind.
Kennt da jemand fertige und freie C-Bibliotheken für den Empfang und die 
Auswertung der NMEA-Datensätze?
Gast #520513
Lesenswert?

Korrekt. Das kann ein Problem sein.

Aber vielleicht ist es eine GPS Maus, die intern seriell ausgibt (TTL 
oder RS232) und die USB Verbindung über einen integrierten RS232-to-USB 
Adapter implementiert. Auf dem PC würde GPS Software die GPS Maus dann 
über eine virtuelle COM Schnittstelle ansprechen.

In dem Fall könnte man versuchen den µC direkt vor dem RS232/TTL-to-USB 
Adapterteil anzuschliessen. Damit bräuchte man keinen USB-Host, sondern 
hätte die GPS-Maus - µC Kommunikation auf banale UART Kommunikation 
reduziert.

Mehr müsste man auch herauskriegen, wenn man sich die 
Treibersoftware/Doku der GPS Maus ansieht. Eine typische Installation 
eines RS232-to-USB Adapter als virtuelle COM Schnittstelle müsste 
auffallen. Besonders, wenn die üblichen verdächtigen Chipnamen 
auftauchen.
Gast #520561
Lesenswert?

> Ich möchte die mittels NMEA-Protokoll eintreffenden Daten auswerten, am
> besten wohl den $GPRMC Datensatz, weil da neben der Geschwindigkeit auch
> noch andere schöne Infos enthalten sind.
falls Interesse besteht, kann ich Dir mein Programmschnipsel zur 
Verfügung stellen.
Es zeichnet die gewünschten Daten, welche von einer RS232 GPS-Maus 
kommen, mittels MSP430 auf einer Smart Media Karte auf. Ich hatte dies 
mal gebaut, um die Geschwindigkeit beim Skifahren messen zu können. (man 
kann abends auch nochmal seine Fahrstrecke am Laptop nachfahren). Spaß 
muß sein
Wolfgang
Gast #522035
Lesenswert?

ich habe mich mal bei den Hersteller von GPS Mäusen erkundigt.

Holux richtet einen virtuellen COM-Port für den USB Adapter ein.
Allerdings hat Holux auf dem miniDin Stecker auh bereits TTL und RS232 
Level.

Bei Navilock und Haicom warte ich noch auf eine Antwort.

Sobald ich da näheres weiß, schreibe ich es hier rein.

@Wolfgang:
Dein Programm würde mich auf jeden Fall mal interessieren. Vor allem die 
Funktion die den Datensatz auseinander nimmt und die nötigen Infos 
herausfiltert.
Gast #522119
Lesenswert?

@Wolfgang

Ich bin im Moment au an so was dran. Wäre echt toll wenn Du mir deinen 
Programmierschnippsel zur Verfügung zustellen könntest. Hier meine Mail 
Addy reflection@reflectionracing.ch

Gruss und Merci schon einmal im Voraus

reflection
#522147
Lesenswert?

Muß es denn eine GPS-Maus sein? GPS-Modul samt externer Antenne kosten 
zusammen die Hälfte von einer GPS-Maus und das Modul kann sich direkt 
mit dem Controller über UARt unterhalten, sogar schon auf TTL-Pegel. Und 
eine Platine hat man ja sowieso, da kann also auch das Modul mit drauf.
Gast #522527
Lesenswert?

Such doch mal nach N4TXI hier im Forum (Ach - geht ja erst, wenn man 
ANGEMELDET ist).

sieht dann ungefähr so aus (funktioniert sehr gut)
1
/******************************************************************************/
2
extern void MsgHandler(unsigned char newchar)
3
/*******************************************************************************
4
* ABSTRACT:  Processes the characters coming in from USART.  In this case,
5
*        this is the port connected to the gps receiver.
6
*
7
* INPUT:    newchar  Next character from the serial port.
8
* OUTPUT:  None
9
* RETURN:  None
10
*/
11
{
12
  static unsigned char  commas;      // Number of commas for far in sentence
13
  static unsigned char  index;      // Individual array index
14

15
  if (newchar == 0)              // A NULL character resets GPS decoding
16
  {
17
    commas = 25;              // Set to an outrageous value
18
    sentence_type = FALSE;        // Clear local parse variable
19
    return;
20
  }
21

22
  if (newchar == '$')            // Start of Sentence character, reset
23
  {
24
    commas = 0;                // No commas detected in sentence for far
25
    sentence_type = FALSE;        // Clear local parse variable
26
    return;
27
  }
28

29
  if (newchar == ',')            // If there is a comma
30
  {
31
    commas += 1;              // Increment the comma count
32
    index = 0;                // And reset the field index
33
    return;
34
  }
35

36
  if (commas == 0)
37
  {
38
    switch(newchar)
39
    {
40
      case ('C'):              // Only the GPRMC sentence contains a "C"
41
        sentence_type = GPRMC;    // Set local parse variable
42
        break;
43
      case ('S'):              // Take note if sentence contains an "S"
44
        sentence_type = 'S';      // ...because we don't want to parse it
45
        break;
46
      case ('A'):              // The GPGGA sentence ID contains "A"
47
        if (sentence_type != 'S')  // As does GPGSA, which we will ignore
48
          sentence_type = GPGGA;  // Set local parse variable
49
        break;
50
    }
51

52
    return;
53
  }
54

55
  if (sentence_type == GPGGA)      // GPGGA sentence  decode initiated
56
  {
57
    switch (commas)
58
    {
59
      case (1):                  // Time field, grab characters
60
        Time_Temp[index++] = newchar;
61
        return;
62
      case (2):                  // Latitude field, grab chars
63
        Latitude_Temp[index++] = newchar;
64
        return;
65
      case (3):
66
        Northsouth_Temp = newchar;  
67
        return;
68
      case (4):                  // Longitude field, grab chars
69
        Longitude_Temp[index++] = newchar;
70
        return;
71
      case (5):
72
        Eastwest_Temp = newchar;
73
        return;
74
      case (7):                  // Satellite field, grab chars
75
        Satellites_Temp[index++] = newchar;
76
        return;
77
      case (9):                  // Altitude field, grab chars
78
        Altitude_Temp[index++] = newchar;
79
        return;
80
    }
81

82
    return;
83
  }    // end if (sentence_type == GPGGA)
84

85
  if (sentence_type == GPRMC)      // GPGGA sentence  decode initiated
86
  {
87
    switch (commas)
88
    {
89
      case (7):                  // Speed field, grab characters
90
        Speed_Temp[index++] = newchar;
91
        return;
92
      case (8):                  // Course field, grab characters
93
        Course_Temp[index++] = newchar;
94
        return;
95
    }
96

97
    return;
98
  }    // end if (sentence_type == GPRMC)
99

100
  return;
101

102
}    // End MsgHandler(unsigned char newchar)

doch ganz schön lang, hätte man anhängen sollen,..

AxelR.
Gast #526721
Lesenswert?

Nach meinem Skiurlaub (GPS Datenaufzeichnung war wieder mit dabei) heute 
die versprochenen Programmschnipsel.

Sie entstanden unter Verwendung der hier im Forum aufgeworfenen Themen:
„MSP430 UART Zeichenkette ausfiltern „  +  „GPS Datenstrom filtern“
Es wäre sinnvoll, hier mal nachzulesen.

Mein Prinzip ist folgendes: alle ankommenden Zeichen werden in ein 1024 
bytes großes Feld [Tabelle_roh] geschrieben. Wird die im 
Interrupt-Unterprogramm   __interrupt void usart0_rx (void) festgelegte 
Zeichenfolge erkannt, ist das Ende des Datensatzes $GPGGA erreicht und 
es werden die 147 davor liegenden Zeichen aus dem Feld [Tabelle_roh ] 
ausgelesen, um dann weiter verarbeitet zu werden. (auf SM-Karte 
speichern, ….)
Zur Anzeige von Geschwindigkeit, Koordinaten, Uhrzeit usw. werden die 
aus dem Internet herunterladbaren Programme „gps_diag.zip“ und 
„VisualGPSInstall.exe“ verwendet, welche die Datensätze auswerten. Man 
kann auch ein Navigationsprogramm verwenden und dort die Datensätze 
abspielen. Dann hat man sogar eine Landkarte dazu.

Wolfgang
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren