C++ NMEA-checksum

Gast #613330
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
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
> 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;
Gast #616262
Stimmt. Ich übergehe ja einfach das erste Zeichen. Dann ist mir jetzt 
auch klar, wozu der Check auf eine Größe von 0 bei Olafs Code da war.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.