Files
nuki_hub/lib/CRC16/examples/Crc16_Example/Crc16_Example.ino
2024-07-15 18:20:52 +07:00

85 lines
2.1 KiB
C++

#include <Crc16.h>
//Crc 16 library (XModem)
Crc16 crc;
void setup()
{
Serial.begin(38400);
Serial.println("CRC-16 bit test program");
Serial.println("=======================");
}
void loop()
{
/*
Examples of crc-16 configurations
Kermit: width=16 poly=0x1021 init=0x0000 refin=true refout=true xorout=0x0000 check=0x2189
Modbus: width=16 poly=0x8005 init=0xffff refin=true refout=true xorout=0x0000 check=0x4b37
XModem: width=16 poly=0x1021 init=0x0000 refin=false refout=false xorout=0x0000 check=0x31c3
CCITT-False:width=16 poly=0x1021 init=0xffff refin=false refout=false xorout=0x0000 check=0x29b1
see http://www.lammertbies.nl/comm/info/crc-calculation.html
*/
//calculate crc incrementally
byte data[] = "123456789";
Serial.println("Calculating crc incrementally");
crc.clearCrc();
for(byte i=0;i<9;i++)
{
Serial.print("byte ");
Serial.print(i);
Serial.print(" = ");
Serial.println(data[i]);
crc.updateCrc(data[i]);
}
unsigned short value = crc.getCrc();
Serial.print("crc = 0x");
Serial.println(value, HEX);
Serial.println("Calculating crc in a single call");
//XModem
value = crc.XModemCrc(data,0,9);
Serial.print("XModem crc = 0x");
Serial.println(value, HEX);
//Reference xmodem
Serial.println("Reference XModem crc");
value = calcrc((char*)data, 9);
Serial.print("crc = 0x");
Serial.println(value, HEX);
//Modbus
value = crc.Modbus(data,0,9);
Serial.print("Modbus crc = 0x");
Serial.println(value, HEX);
//Mcrf4XX
value = crc.Mcrf4XX(data,0,9);
Serial.print("Mcrf4XX crc = 0x");
Serial.println(value, HEX);
while(true);
}
//Check routine taken from
//http://web.mit.edu/6.115/www/miscfiles/amulet/amulet-help/xmodem.htm
int calcrc(char *ptr, int count)
{
int crc;
char i;
crc = 0;
while (--count >= 0)
{
crc = crc ^ (int) *ptr++ << 8;
i = 8;
do
{
if (crc & 0x8000)
crc = crc << 1 ^ 0x1021;
else
crc = crc << 1;
} while(--i);
}
return (crc);
}