www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik CRC-16 Prüfsumme (serielle Übertragung)


Autor: Olaf Rechtner (gruser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe hier den untenstehenden Code gefunden zur Berechnung einer 
Checksumme (CRC-16), allerdings bekomme ich in den beiden Bytes des 
Ergebnisses jeweils nur eine "1".

Was mache ich falsch? Wenn ich aus 3 Bytes einen CRC-Wert ermitteln
möchte, muss ich die Funktion doch einfach nur 3x aufrufen:

  DEVICE_CRC16 = calcCRC16r (DEVICE_CRC16,Wert1,0xA001);
  DEVICE_CRC16 = calcCRC16r (DEVICE_CRC16,Wert2,0xA001);
  DEVICE_CRC16 = calcCRC16r (DEVICE_CRC16,Wert3,0xA001);

Die beiden Bytes frage ich mit DEVICE_CRC16.low8 bzw. DEVICE_CRC16.high8
ab. Bei den Deklarationen von Wert1-3 habe ich bereits alles probiert
(uns16/ uns8, char) - am Ergebnis hat es nichts geändert.
Außerdem glaube ich nicht dass das Polynom A001 (bzw. 
"1010000000000001") dem Polynom von CRC16 entspricht...

Kennt sich hier jemand gut aus?

Grüße
Olaf









//- calcCRC16r ------------------------------------------------------
unsigned int calcCRC16r(unsigned int crc, unsigned int c, unsigned int
mask)
{
  unsigned char i;
  for(i=0;i<8;i++)
  {
    if((crc ^ c) & 1) { crc=(crc>>1)^mask; }
    else crc>>=1;
    c>>=1;
  }
  return (crc);
}
//-------------------------------------------------------------------

Aufruf der Funktion im Programm:

{
//...
  unsigned int DEVICE_CRC16=0;
  DEVICE_CRC16 = calcCRC16r (DEVICE_CRC16,chr,0xA001);
//...
}

Autor: so nicht (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja. Mein code :

PROCEDURE calcCRCbyte(data:BYTE;VAR crc:WORD);
VAR i:BYTE;
BEGIN
 FOR i:=0 TO 7 DO BEGIN
   IF ((data and $01)XOR(crc AND $0001)<>0) THEN BEGIN
     crc:=crc shr 1;
     crc:= crc XOR $A001;
    END
   ELSE BEGIN
     crc:=crc shr 1;
    END;
   data:=data shr 1;
  END;
END;

Deiner scheint etwas kuerzer zu sein, dh etwas wegzulassen.

Autor: Michael K. (mmike)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier einer in C:

HEADER:
/*****************************************************************************
* Name: crcCCITT()
* Eingaben: - Laenge der Nachricht
* - Zeiger auf die Nachricht
* - CRC-Vorladewert, Startwert ist 0xFFFF
* Ausgaben: - CRC von der Nachricht
* Beschreibung: Die Funktion berechnet den CRC von der Nachricht nach dem
* Generatorpolynom g(x) = x^16+ x^12 + x^5 + 1 (CCITT-Polynom).
*****************************************************************************/
 
#ifndef __CRC16_H__
#define __CRC16_H__
 
#include <inttypes.h>
 
#define poly  0x1021    // g(x) = (x^16+) x^12 + x^5 + 1
 
uint16_t crcCCITT(uint8_t size, volatile uint8_t * mem, uint16_t crc);
 
#endif


IMPLEMENTATION:
uint16_t crcCCITT(uint8_t size, volatile uint8_t * mem, uint16_t crc)
{
  //  static int i,j;
  uint8_t i;
  uint8_t j;
 
  //  static unsigned short b;
  uint8_t b;
 
  //  static unsigned char m;
  uint8_t m;
 
  // While (more message bits)
  for (i = 0; i < size; i++)
  {
    m = mem[i];
    for( j = 8; j; j-- )
    {
      b = 0;
      if(crc & 0x8000)
        b++;
      // Shift the register left by one bit,
      crc <<= 1;
      if ((m & 0x80) != 0) crc |= 1;
      m <<= 1;
      // If (a 1 bit popped out of the register during step 3)
      // Register = Register XOR Poly.
      if (b != 0) 
        crc ^= poly;
    }
  }
  return crc;
}


Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.