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


von camel coder (Gast)


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!

von Karl H. (kbuchegg)


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!

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.