
Сообщение от
Vslav
Моя функция crc16_m2() - это НЕ алгоритм CRC. Это итеративная функция полиномиального деления, как оно понимается в математике. Она умножает аргумент crc на 0x100, добавляет data и находит остаток от деления на полином 0x11021.
Но нужен остаток от деления именно бита данных на полином, а не остаток от деления 17-го бита CRC на полином.
Какой смысл делить 17-й бит CRC на полином, если деление бита данных на полином при этом не происходит и приходится дополнительно вызывать функцию 16 раз, чтобы бит данных наконец поделился на полином и сформировал остаток..
---------- Post added at 15:33 ---------- Previous post was at 14:58 ----------
Насколько я понимаю, функция crc16_m2 - это не итеративная функция полиномиального деления CRC, а функция полиномиального деления 17-го бита CRC для каждого бита данных:
Код:
unsigned short int crc16_m2(unsigned short crc, unsigned char data)
{
int i;
printf("\n %02X ( %04X,", data, crc);
for(i=0; i<8; i++) // для каждого бита данных
{ // выполнить деление 17-го бита CRC на полином 0x11021
if (crc & 0x8000)
{
crc <<= 1;
crc |= (data >> 7) & 1;
crc ^= 0x1021;
}
else
{
crc <<= 1;
crc |= (data >> 7) & 1;
}
data <<= 1;
}
printf(" %04X )", crc );
return crc;
}
Когда в 17-м бите CRC находится текущий бит данных - это именно то, что надо, но когда текущий бит данных находится на 16 битов правее - функция даёт корректный результат только после 17-го вызова, с задержкой выдачи результата для текущего бита данных на 16 вызовов. Т.е. чтобы учесть корректный результат полиномиального деления для последнего бита данных - после передачи в функцию последнего бита данных нужно вызвать функцию crc16_m2 ещё 16 раз.