PDA

Просмотр полной версии : сетевой протокол овен по Rs-485. рассчет Crc.



Anatol_rus
05.10.2011, 15:31
Всем доброго времени суток. При расчете CRC сталкнулся вот с какой ситуацией:
1. Взял из примера - http://www.softelectro.ru/8_1.html, данные чтобы рассчитать ее CRC и проверить правильность алгоритма.
Брал формулу расчета CRC тут - http://www.owen.ru/uploads/type_prot_owen.zip, из пункта 4.5, в тогде, функция получилась следующая :


//Âû÷èñëåíèå CRC
UINT Hash(USINT ArrayData[120],INT Len)
{
INT j,i;
UINT CRC;
USINT Byte;
CRC = 0x0000;
for (j = 0;j < Len;j++)
{
Byte = ArrayData[j] << 1 ;
for (i = 0; i < 7; i++, Byte <<= 1)
{
if ( ( Byte ^ (CRC>>8) ) & 0x80 )
{
CRC <<= 1; CRC ^= 0x8F57;
}
else CRC <<= 1;
}
}
return CRC;
}


Byte = ArrayData[j] << 1 ; - данная строка, получалась, так как в примере описанном ниже в п.4.5, входные значения сдвигались влево.

После чего пробовал высчитать контрольную, сумму для -

0x04 0x10 0xC1 0x73
После расчета получалось -
0xBD 0xEA
вместо -
0x79 0x1E

После, этого перелазил форум и нашел данную схожую тему - http://www.owen.ru/forum/showthread.php?t=8884&highlight=%F0%E0%F1%F1%F7%E5%F2+CRC, при проверки его контрольной суммы, она совпадала с его рассчитанной, но не с той которая должна была получиться.
После этого, в той же теме привлек мое внимание 3 пост - http://www.owen.ru/forum/showpost.php?p=47374&postcount=3, с рассчетом CRC на QT, где не было просто первоначального левого сдвига и старшим битом считался не 7, как написано было в оф.описании протокола, а 8 бит, после не хитрой корректировки, получилось следующее :

UINT Hash(USINT ArrayData[120],INT Len)
{
INT j,i;
UINT CRC;
USINT Byte;
CRC = 0x0000;
for (j = 0;j < Len;j++)
{
Byte = ArrayData[j] ;
for (i = 0; i < 8; i++, Byte <<= 1)
{
if ( ( Byte ^ (CRC>>8) ) & 0x80 )
{
CRC <<= 1; CRC ^= 0x8F57;
}
else CRC <<= 1;
}
}
return CRC;
}
И о чудо, контрольные суммы сошлись для описанных выше примеров.

После всего, этого возникает вопрос - это ошибка описания протокола или я что-то не правильно понял и делал?

Илья Глан
05.10.2011, 16:35
посмотрите вот эти ссылки
http://www.owen.ru/forum/showpost.php?p=35715&postcount=1
http://www.owen.ru/forum/showpost.php?p=42334&postcount=16

Anatol_rus
05.10.2011, 16:56
Спасибо, за ответ, все сомнения развеяны