www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bytes in Hexzahl vertauscht? CRC16 problem


Autor: camel coder (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
n'abend zusammen ...

ich bin auf euren monströsen intellekt und eure astronomische erfahrung 
angewiesen:

ein dummes kleines problem, zu dem ich aber bisher keine lösung gefunden 
hab (forum, internet.de ...)

folgende umgebung:
µC: dspic30f4013
RFID-Reader: ID ISC.MR101 (FeigElektronik)
compiler: C30
testcompiler für teilprogramme(PC): mingw gcc

für die kommunikation von RFID-Reader zu µC wird ein CRC-16 algorithmus 
verwendet (vom RFID-Hersteller vorgegeben):
unsigned int crc16 (unsigned char cnt, unsigned char DATA[]){
  unsigned int output = 0xffff;
  unsigned char i,j;
  for(i=0;i<cnt;i++){
    output ^= DATA[i];
    for(j=0;j<8;j++){
      if(output & 0x0001)
        output = (output >> 1) ^ 0x8408; //CRC-Polynom
      else
        output = (output >> 1);
    }
  }
  return output;
}

(ist bestimmt nicht effizient, is mir aber im moment wurscht)


problem:
die berechnete prüfsumme stimmt nicht mit der tatsächlichen prüfsumme 
überein (die sieht man im übertragungsprotokoll der beiliegenden 
rfid-software)
beispiel:
nachricht ist:
14 FF 81 81 00 00 08 01 00 00 00 1E 00 00 00 00 01 01 E6 EC
(die letzten beiden bytes sind CRC)

der algorithmus berechnet aber folgendes:
ece6
also genau die beiden bytes vertauscht ...

wie fummel ich die wieder auseinander und dreh sie so hin wie ich sie 
brauch? bzw, wie nehm ich aus dem unsigned int 'ece6' das 'ec' und das 
'e6' raus?

ich glaube hier schonmal was ähnliches auf der seite gesehen zu haben, 
finds aber ums verrecken nicht mehr ...

danke leute, ihr seid großes tennis!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
camel coder schrieb:

> nachricht ist:
> 14 FF 81 81 00 00 08 01 00 00 00 1E 00 00 00 00 01 01 E6 EC
> (die letzten beiden bytes sind CRC)
>
> der algorithmus berechnet aber folgendes:
> ece6
> also genau die beiden bytes vertauscht ...

Ne passt schon. Im Datenstrom kommt einfach nur das Low Byte zuerst und 
dann erst das High Byte

>
> wie fummel ich die wieder auseinander

so wie bei jeder anderern 16 Bit Zahl auch

  lowByte = crc & 0xFF;
  highByte = crc >> 8;

> und dreh sie so hin wie ich sie
> brauch?

Du stellst die beiden Bytes einfach in der richtigen Reihenfolge in den 
Buffer

> ich glaube hier schonmal was ähnliches auf der seite gesehen zu haben,
> finds aber ums verrecken nicht mehr ...

Einen unsigned int in seine Bytes zerlegen?
Kommt doch jeden Tag mindestens 3 mal vor!

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.