www.mikrocontroller.net

Forum: GCC GPSZEIT in Stunden,Minuten,Sekunden

Autor: Michael (Gast)
Datum: 01.07.2008 19:15

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: 01.07.2008 19:47

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: 01.07.2008 21:14

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: 01.07.2008 22:41
Dateianhang: garbage.c (736 Bytes, 30 Downloads) | formatierter Code

>> 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 Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
  • Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net