PDA

View Full Version : Calcolo del CRC16 CCITT


maxmcas@gmail.com
19-11-2013, 06:08
Buongiorno a tutti.
Sono nuovo del forum e vi ringrazio già per l'aiuto.
Sto uscendo pazzo. Sono un programmatore c++ e python. Lavoro in ambiente linux (uso debian da molti anni).
Sto lavorando ad un software in python per la comunicazione di dati con un lettore rfid. Tale lettore rfid attraverso comunicazione seriale mi trasferisce il seguente pacchetto:

22 00 1f 00 0f 00 01 00 19 01 0b 00 00 00 00 80 21 ff 5a 68 36 04 0f 0b 0d 10 2b 0d 00 00 1e 0f ba 0b

Da quello che è scritto nella documentazione gli ultimi due byte (ba 0b) sono il risultato del CRC (avente come polinomio generatore x^16,x^12,x^5,x^0)

Il primo byte (22) indica che che il pacchetto è di 34 byte e la casa madre del
lettore mi ha detto che tale valore è compreso nel calcolo (quindi il calcolo comprende i primi 32 byte).

Purtroppo pero' i conti non tornano. La casa madre mi ha dato una funzione in c#. Peccato che nel mio lavoro, anche se ho installato windows, non uso visual studio.

In questo sito potete vedere quello che la mia funzione in python mi ritorna:
http://ghsi.de/CRC/index.php?Polynom=10001000000100001&Message=22+00+1f+00+0f+00+01+00+19+01+0b+00+00+00+00+80+21+ff+5a+68+36+04+0f+0b+0d+10+2b+0d+00+00+1e+0f

Mentre la funzione che mi hanno fornito in c# è la seguente:


protected int CalcCRC16CheckSum(byte[] cBuffer, int iBufLen, ref byte LSB, ref byte MSB)
{
uint wPolynom = 0x8408;
uint wPreset = 0xFFFF;

int i, j;
uint wCrc = wPreset; //WORD

for (i = 0; i < iBufLen; i++)
{
wCrc ^= cBuffer[i];

for (j = 0; j < 8; j++)
{
if ((wCrc & 0x0001) == 1)
wCrc = (uint)((wCrc >> 1) ^ wPolynom);
else
wCrc = (uint)(wCrc >> 1);
}
}
LSB = (byte)(wCrc & 0xFF);
MSB = (byte)((wCrc & 0xFF00) / 256);

return (int)wCrc;
}

Prego a chiunque di darmi una mano. Non so dove sbaglio. Purtoppo sono in stallo e la scadenza si avvicina.

Max

ingframin
19-11-2013, 10:55
Ciao,
Hai provato a far girare la loro funzione usando mono?
che protocollo RFID usate? 14000-7? Mi sa che il crc e' calcolato solo sul pacchetto di dati, quindi non sull'intestazione!