www.mikrocontroller.net

Forum: Compiler & IDEs GPSZEIT in Stunden,Minuten,Sekunden


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich parse den GPGGA GPS Satz und möchte die Uhrzeit am Display anzeigen.


    ich erhalte: Gps.utctime = 170552;

    Gps.hour   = Gps.utctime / 10000;
    Gps.second = Gps.utctime % 100;
    Gps.minute =(Gps.utctime % 10000)/100;

Gps.hour ist dann 17
Gps.second ist dann 52
Gps.minute ist dann 5

wenn ichs mit dem Taschenrechner nachrechne stimmt es, aber im Betrieb 
wird manchmal eine Sekunde ausgelassen.

Ist die Umrechnung oben so korrekt oder würdet ihr das anderst machen?

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist Gps.utctime tatsächlich ein int (bzw.long)? (und warum ?)
in den NMEA-Daten steht's doch als string:
  char time_buffer[] = "170552"; // immer "hhmmss"
  int8_t std = (time_buffer[0]-'0') *10;
  std += time_buffer[1] - '0';
  int8_t min = (time_buffer[2]-'0') *10;
  min += time_buffer[3] - '0';
  int8_t sec = (time_buffer[4]-'0') *10;
  sec += time_buffer[5] - '0';

hth. Jörg
ps.: das "-'0'" wird (spätestens dann) klar, wenn du einen Blick in die 
ASCII-Tabelle (in deinem C-Buch) wirfst ;)

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void nmeaGPGGA(char* packet)
{
  u08 i=6;
  char time_buffer[7];

  if(packet[i]==',' && packet[i+1]==',')return;

  while(packet[++i] != ',')time_buffer[i-7]=packet[i];  
  
  Gps.hour    = (time_buffer[0] - '0') *10;
  Gps.hour   +=  time_buffer[1] - '0';
  Gps.minute  = (time_buffer[2] - '0') *10;
  Gps.minute +=  time_buffer[3] - '0';
  Gps.second  = (time_buffer[4] - '0') *10;
  Gps.second +=  time_buffer[5] - '0';

da ist wohl noch ein Fehler bei mir oder?

Autor: Jörg X. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
>> da ist wohl noch ein Fehler bei mir oder?
Da hab ich keine Ahnung, DENN
 - ich weiß nicht, wie dein Programm aussieht
 - ich weiß nicht, was dein AVR (nicht) macht
 - ich weiß nicht, was dein AVR machen soll
etc...

Aber das Team von strcpy und strtok_r aus der Standardlib funktioniert 
bei mir
// Header
struct date {int h; int m; int s;};
//Main:
    char s[] = "$GPGGA,191410,"\
               "4735.5634,N,00739.3538,E,"\
               "1,04,4.4,351.5,M,48.0,M,,*45";
    char *wort, *end;
    char buffer[10];
    struct date test;
    
    wort = strtok_r(s, ",", &end);
    wort = strtok_r(NULL, ",", &end);
    
    strncpy(buffer, wort, 7);
    
    test.h = (buffer[0] - '0') *10;
    test.h += (buffer[1] - '0');
    test.m = (buffer[2] - '0') *10;
    test.m += (buffer[3] - '0');
    test.s = (buffer[4] - '0') *10;
    test.s += (buffer[5] - '0');

hth Jörg
ps. (mingw-gcc) PC-Programm im Anhang (da heißt die Funktion "strtok" 
und hat weniger argumente)

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.