Bytes in Hexzahl vertauscht? CRC16 problem

Gast #1718419
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):
1
unsigned int crc16 (unsigned char cnt, unsigned char DATA[]){
2
  unsigned int output = 0xffff;
3
  unsigned char i,j;
4
  for(i=0;i<cnt;i++){
5
    output ^= DATA[i];
6
    for(j=0;j<8;j++){
7
      if(output & 0x0001)
8
        output = (output >> 1) ^ 0x8408; //CRC-Polynom
9
      else
10
        output = (output >> 1);
11
    }
12
  }
13
  return output;
14
}

(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!
#1718426
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

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.

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.