CRC16 funktioniert nicht

OP #1030583
Hallo zusammen,

ich versuche eine CRC Redundanzprüfung mit dem CC5X Compiler 
hinzubekommen.

Leider meckert der Compiler in der if-Zeile, er sagt es wäre zwar alles 
C-konform, aber er könnte trotzdem keinen Code erzeugen. Auch meine 
anderen Varianten bringen nicht die richtigen Ergebnisse für 
DEVICE_CRC16 (2 Bytes). Es wäre echt toll wenn hier jemand helfen 
könnte...



//- calcCRC16r ------------------------------------------------------


   uns16 calcCRC16r(uns16 crc, uns8 c, uns16 mask)
   {
    //   mask = 0xA001; // = Polynom x^16 + x^15 + x^2 + 1

   unsigned char i;

   for(i=0;i<8;i++)
      {
       if((crc^c) & 1) {crc=(crc>>1)^mask;}
       else crc=(crc % 2);
       c = c % 2;
      }
   return (crc);
   }


//*******  Hauptprogramm 
*************************************************

void main(void)
{

//...

    uns8 test;
    uns16 DEVICE_CRC16;

    test = 0b.1011.1100;
    test2 = 0b.1001.1110;

    DEVICE_CRC16=0;
    DEVICE_CRC16 = calcCRC16r (DEVICE_CRC16,test,0xA001);

//...

}
Gast #1030605
Irgenwie schlummert in den tiefsten Tiefen meines
Unterbewusstseins die Erkenntnis das CC5X
mehrere komplexe Ausdrücke in einer Zeile
nicht auflösen kann. Berechnungen auf mehrere
Zeilen aufteilen könnte evtl. helfen.
OP #1031722
Habe es aufgeteilt bzw. Variablen eingefügt um Zwischenergebnisse zu 
berechnen - der Code ließ sich dann auch kompilieren. Trotzdem ist das 
Ergebnis immer "0". Was mache ich bei der Polynomendivision falsch? Ich 
kann den Fehler im Code leider nicht finden und verzweifel langsam... lg 
Olaf
#1031750
probier es mal hiermit

unsigned short CalcCrc16(unsigned char* a_pArr, const unsigned int
a_nLen) {
  unsigned short nCrc = 0, nIndex, nCount;
  for (nCount = 0; nCount < a_nLen; nCount++) {
    nCrc = nCrc ^ (a_pArr[nCount] << 8);
    for (nIndex = 1; nIndex <= 8; nIndex++) {
     if ((nCrc & 0x8000) != 0)
  nCrc = ((nCrc << 1) ^ 0x1021);
     else
  nCrc = (nCrc << 1);
     }
  }
  return (nCrc & 0xFFFF);
}
OP #1032764
Hi Lothar,

deinen Code habe ich auch hier gefunden, nur bin ich davon ausgegangen 
dass die Funktion an der ich rumbastel nach dem Kompilieren kompakter 
wäre - was aber nicht stimmen muss. Ich probiere deine Funktion am 
Wochenende einmal aus - dankeschön.

Gruß
Olaf

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 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.