www.mikrocontroller.net

Forum: Compiler & IDEs NMEA Checksum berechnen


Autor: HerrmannA (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe ein kleines Problem mit der Checksumme eines NMEA Datensatztes

folgendes habe ich ausprobiert
char nmea_checksum()
{
char* st1="GPZDA,201530.00,04,07,2002,00,00";
int i;
unsigned char XOR;
unsigned long ilen=strlen(st1);
for (XOR=0,i=0;i<ilen;i++)
{
XOR^=(unsigned char)st1[i];
}
return((int)XOR);
}

als ergebnis sollte 6e rauskommen

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Entscheide dich ;-)

char nmea_checksum()
{
  // ...
  unsigned *char* XOR;
  // ...
  return(( int ) XOR);
}

Autor: HerrmannA (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
int nmea_checksum()
{
char* st1="GPZDA,201530.00,04,07,2002,00,00";
int i;
unsigned char XOR;
unsigned long ilen=strlen(st1);
for (XOR=0,i=0;i<ilen;i++)
{
XOR^=st1[i];
}
return((int)XOR);
}

kommt trotzdem nicht das raus was rauskommen sollte

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was soll denn rauskommen? Bei dem angegebenen String auf jedenfall nicht
6E sondern 60.

Hier ein Beispiel mit einem NMEA Datensatz aus einem Wiki-Artikel hier.
Als Prüfsumme steht im Artikel 7D und das kommt auch raus.

#include <stdio.h>

unsigned char nmea_checksum(void)
{
  // char * st1 = "GPZDA,201530.00,04,07,2002,00,00";
  char * st1 =
"GPGGA,235957.000,0000.0000,N,00000.0000,E,0,00,99.0,0082.0,M,18.0,M,,,";

  int i;
  unsigned char XOR;
  unsigned long ilen;

  ilen = strlen(st1);

  for (XOR=0,i=0;i<ilen;i++)
  {
    XOR ^= st1[i];
  }

  return(XOR);
}


int main(void)
{
  printf("%x\n", nmea_checksum());

  return 0;
}


Autor: HerrmannA (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Soweit so gut besten Dank

aber wie kann ich jezt die checksummen vergleichen.

die orginale ist in einem Char Array

z.B org checksumme=6f
orgcs[0]=6
orgcs[1]=f

wie vergleiche ich denen mit dem rückgabe wert???

mit memcmp(orgcs,nmea_checksum,2)==0 wird nie ereicht da ungleich.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Häh?

Wenn in char orgcs[] Acsiizeichen stehen, die Hexnibbles repräsentieren
mit dem Wertebereich 0-9,A-F (Grossschreibung!, kann man durch eine
Hexascii nach int Wandlung die Checksumme errechnen. In etwa so

unsigned char checksum;
checksum = ((orgcs[0] - '0') << 4) | (orgcs[1] - '0');

Der Thread hat schwach angefangen und hat jetzt ganz stark
nachgelassen. Ich klinke mich aus.

Autor: MasterFX (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich habs immer so gemacht:
char telegram[] = "$GPZDA,201530.00,04,07,2002,00,00";

unsigned char make_checksum(char *string){
  unsigned char value=0;
  while(*string != '*' ){
    value ^= *(string++);
  }
  return value;
}

int main(){
   unsigned char check;
   check = make_checksum(&telegram[1]);
  
   return 0;
}


Autor: MasterFX (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach das Telegramm ist natürlich unvollständig:
char telegram[] = "$GPZDA,201530.00,04,07,2002,00,00*60";

Autor: HerrmannA (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Besten Dank

Werde es heute abend mal ausprobieren.

Habe noch einige Probleme mit C habe vorher in Bascom gearbeitet
Muß aber sagen der schritt nach C muß gemacht werden die Performance
gegenüber Bascom ist in C enorm.

Autor: HerrmannA (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Habe das Problem lösen können die Routine von MasterFX und die
Umwandlung meines Char[2] mit dem orginal Checksumm wurde mit dieser
checksummorg = strtol(cs, NULL, Base); umgewandelt
Base=16


if(berechnete_cs==checksummorg)
{



ausweten des GPS String

}


Funtioniert jetzt prima.


Nochmals an alle besten dank

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.