C++ NMEA-checksum

Gast #613330
Lesenswert?
• ▲
▼
Hallo,

ich möchte von jedem Daten der von der GPS-Maus kommt die Checksumme 
berechnen.
1
int CheckChecksum(char* packet)
2
{
3
  unsigned char Character,x;
4
  unsigned int Checksum = 0;
5
  int i,length;
6

7
  length = strlen(packet);
8

9
  for(i=0;i<length;i++)
10
  {
11
    Character = packet[i];
12
    
13
    if (Character == '$')
14
    {
15
      // Ignore the dollar sign
16
    }
17
    else if (Character == '*')
18
    {
19
      // Stop processing before the asterisk
20
      break;
21
    }
22
    else
23
    {
24
      if(Character != '$')
25
        Checksum ^= Character;
26
    }
27
  } 
28
 return 0;
29
}

Datensatz:

$GPRMC,081638,V,4856.4987,N,00822.1526,E,,,250707,000.6,E*61

Checksumme: 61

Mit meiner Funktion erhalte ich da 97. Wo könnte da der Fehler liegen?
#614140
Lesenswert?
• ▲
▼
Interessanterweise liefert die Funktion immer 0 zurück... Ein wenig 
umständlich ist das ganze zudem formuliert:
1
unsigned char Character;
2
unsigned int i=1, Checksum = 0;
3

4
if (strlen(packet) == 0) return 0;
5

6
while (packet[i] != '*')
7
{
8
   Checksum ^= packet[i++];
9
}
10
return Checksum;
Gast #614401
Lesenswert?
• ▲
▼
> if (strlen(packet) == 0) return 0;

Den gesamten String durchparsen, um festzustellen, ob er leer ist, 
könnte man auch als "umständlich" bezeichnen, vor allem, weil man dafür 
gar keine Sonderbehandlung braucht.
Außerdem wird dein Code amoklaufen, wenn im String mal kein Stern 
enthalten ist. Dazu kann es Probleme geben, wenn char vorzeichenbehaftet 
ist. Ich würd's wohl etwa so schreiben:
1
unsigned char Checksum = 0;
2
++packet;
3
while (*packet != '*' && *packet != '\0')
4
   Checksum ^= *(unsigned char*)packet++;
5

6
return Checksum;

Wobei ich zum Iterieren eigentlich gerne auch eine for-Schleife nehme:
1
for (packet++; *packet != '*' && *packet != '\0'; packet++)
2
   Checksum ^= *(unsigned char*)packet;

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