Forum: Compiler & IDEs NMEA Checksum berechnen


von HerrmannA (Gast)


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

von Stefan (Gast)


Lesenswert?

Entscheide dich ;-)

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

von HerrmannA (Gast)


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

von Stefan (Gast)


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.
1
#include <stdio.h>
2
3
unsigned char nmea_checksum(void)
4
{
5
  // char * st1 = "GPZDA,201530.00,04,07,2002,00,00";
6
  char * st1 =
7
"GPGGA,235957.000,0000.0000,N,00000.0000,E,0,00,99.0,0082.0,M,18.0,M,,,";
8
9
  int i;
10
  unsigned char XOR;
11
  unsigned long ilen;
12
13
  ilen = strlen(st1);
14
15
  for (XOR=0,i=0;i<ilen;i++)
16
  {
17
    XOR ^= st1[i];
18
  }
19
20
  return(XOR);
21
}
22
23
24
int main(void)
25
{
26
  printf("%x\n", nmea_checksum());
27
28
  return 0;
29
}

von HerrmannA (Gast)


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.

von Stefan (Gast)


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.

von MasterFX (Gast)


Lesenswert?

Also ich habs immer so gemacht:
1
char telegram[] = "$GPZDA,201530.00,04,07,2002,00,00";
2
3
unsigned char make_checksum(char *string){
4
  unsigned char value=0;
5
  while(*string != '*' ){
6
    value ^= *(string++);
7
  }
8
  return value;
9
}
10
11
int main(){
12
   unsigned char check;
13
   check = make_checksum(&telegram[1]);
14
  
15
   return 0;
16
}

von MasterFX (Gast)


Lesenswert?

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

von HerrmannA (Gast)


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.

von HerrmannA (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.