//==============================================//
// Функция подсчета СRC16 по алгоритму //
//----------------------------------------------//
//аргументы: указатель на буфер, //
// размер буфера, //
// стартовое значение СRC16 //
//возвращает:подсчитанное значение СRC16 //
//----------------------------------------------//
//ВНИМАНИЕ! Стартовому значению CRC16 необходимо//
// присвоить значение 0xFFFF, //
// размер массива для подсчета CRC16 //
// не более 65535 байт //
//==============================================//
#ifndef _POLINOME_CRC16_
#define _POLINOME_CRC16_ 0xA001
#endif
xWord f_CRC16Calc(xByte *buf, xWord sizeBuf, xWord crc){
xWord i, j;
for(i = 0; i < sizeBuf; i++){
crc = crc ^ buf[i];
for(j = 0; j < 8; j++){
if((crc & 0x0001) != 0x0000)crc = (crc >> 1) ^ _POLINOME_CRC16_;
else crc >>= 1;
}
}
return (crc);
}
#ifndef _POLINOME_CRC16_
#define _POLINOME_CRC16_ 0xA001
#endif
// ========================================================================================
// TNN
#ifndef _POLINOME_CRC16_
#define _POLINOME_CRC16_ 0xA001
#endif
unsigned short f_CRC16Calc(unsigned char *buf, unsigned short sizeBuf, unsigned short crc){
unsigned short i, j;
for(i = 0; i < sizeBuf; i++){
crc = crc ^ buf[i];
for(j = 0; j < 8; j++){
if((crc & 0x0001) != 0x0000)crc = (crc >> 1) ^ _POLINOME_CRC16_;
else crc >>= 1;
}
}
return (crc);}
// ========================================================================================
// Полином тот же, что и в X-modem'е.
unsigned char crc16h, crc16l;
void UpdateCRC16(unsigned char c){
c ^= crc16h;
c ^= (c >> 4);
crc16h = crc16l ^ (c << 4) ^ (c >> 3);
crc16l = c ^ (c << 5);
}