NMEA Checksum berechnen

Gast #367142
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
Gast #367144
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
Gast #367145
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
}
Gast #367146
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.
Gast #367147
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.
Gast #367148
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
}
Gast #367150
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.
Gast #367151
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

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