CRC16 von einem char-Array errechnen

Gast #2256063
Lesenswert?

Hallo,

ich weiß es wurde schon oft CRC16 durchgekaut, aber ich kann die Lösung 
nicht rauslesen.

Ich möchte mit der avr-lib crc16.h aus einem char-Array die Checksumme 
berechnen, und diese dann mittels 2 bytes an das Array drannhängen.
1
/* Berechnet den CRC16-Wert aus einem ganzen Array */
2
uint16_t calculate_crc16(uint8_t* data, uint8_t number)
3
{
4
  uint16_t crc = 0xffff;
5
  uint8_t i;
6
  for(i=0; i<number; i++)
7
  {
8
    crc = _crc16_update(crc, *data++);
9
  }
10
  return crc;
11
}

Aufrufen tu ich die Funktion folgendermaßen:
1
  crc16 = calculate_crc16(frame, number+3);
2
  frame[number+3] = crc16 >> 8;
3
  frame[number+4] = crc16 & 0x00ff;

Das Rückrechnen mit der Funktion stimmt nicht, ich bin mir auch 
unsicher, wie ich den Startwert nicht mit 0x000 sondern 0xffff mache, 
und was dann bei der Prüfung rauskommen muss... auch 0x0000?

Danke an alle konstruktive Beiträge!
Gast #2257695
Lesenswert?

Hab den Fehler gefunden! Hab das in einem Thread an irgendeiner Stelle 
mal gelesen! Damit nicht jemand anders noch genauso lange sucht:

Den Nutzdaten müssen die 2 CRC bytes in umgekerter Reihenfolge angehängt 
werden, damit die Überprüfung des gesammten Frame 0x0000 ergibt.
Also erst Low-Byte und dann High-Byte:
1
  crc16 = calculate_crc16(frame, number+3);
2
  frame[number+4] = crc16 >> 8;
3
  frame[number+3] = crc16 & 0x00ff;

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