Forum: Mikrocontroller und Digitale Elektronik CRC16 bei ungerader byte Anzahl


von Alex E. (alex_e)


Lesenswert?

Hi,
komme nicht auf die richtigen Ergebnisse...
Habe einen undefinierte Anzahl von Bytes und möchte diesen 2byte CRC16 
Prüfsumme hinzufügen.

Benutze folgende Funkion aus dem Forum:
1
u16 calcCRC16r(u16 crc, u16 c, u16 mask)
2
{
3
  unsigned char i;
4
  for(i=0;i<8;i++)
5
  {
6
    if((crc ^ c) & 1) { crc=(crc>>1)^mask; }
7
    else crc>>=1;
8
    c>>=1;
9
  }
10
  return (crc);
11
}

und möchte es so aufrufen (5 Daten-Bytes):
1
  u16 crc = 0x0000;
2
  u16 crcData = 0;
3
  
4
  crcData = (ConfigGlobal.myAdress << 8) | ConfigGlobal.masterAdress;
5
  crc = calcCRC16r(crc, crcData, CRC16_POLYNOM);                      // Byte 1+2
6
  crc = calcCRC16r(crc, (8<<1) | 1, CRC16_POLYNOM);                      // Byte 3+4
7
  crc = calcCRC16r(crc, (!ConfigGlobal.EndModule) << 8, CRC16_POLYNOM);  // Byte 5 + x
8
// war das Richtig???? und jetzt??? wie bekomme ich in byte 6 + 7 die Prüfsumme????
9
  crc = calcCRC16r(crc, 0, CRC16_POLYNOM);

Habe folgende Daten als Beispiel "05fe080101" (hex)...
laut Online Calculator sollte 0x7ABC als Prüfsumme rauskommen, nur kommt 
bei mir nicht....

Was mache ich falsch???

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Eine CRC berechnet man normalerweise byteweise.  Das macht dein
Algorithmus übrigens auch, denn die Schleife geht nur über 8 Bits.
Es ist also nicht sinnvoll, ein 16-Byte-Datenwort "c" überhaupt
erst zu übergeben.

von Alex E. (alex_e)


Lesenswert?

Vielen Dank.
läuft...
1
  crc = calcCRC16r(crc, ConfigGlobal.myAdress, CRC16_POLYNOM);
2
  crc = calcCRC16r(crc, ConfigGlobal.masterAdress, CRC16_POLYNOM);
3
  crc = calcCRC16r(crc, 8, CRC16_POLYNOM);
4
  crc = calcCRC16r(crc, 1, CRC16_POLYNOM);
5
  crc = calcCRC16r(crc, 1, CRC16_POLYNOM);

: Bearbeitet durch User
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.