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
Entscheide dich ;-) char nmea_checksum() { // ... unsigned *char* XOR; // ... return(( int ) XOR); }
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
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 | }
|
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.
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.
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 | }
|
ach das Telegramm ist natürlich unvollständig:
1 | char telegram[] = "$GPZDA,201530.00,04,07,2002,00,00*60"; |
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.