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
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.
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.
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