Forum: Mikrocontroller und Digitale Elektronik CRC16 von einem char-Array errechnen


von tweaker (Gast)


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!

von tweaker (Gast)


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;

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
Noch kein Account? Hier anmelden.