Помогите pls.Есть дока на устройство:
Генерирующий полином :
СRC-CCITT = X16 + X12 + X5 + 1
...
LSB в первом байте текста является старшим управляющим битом для вычисления CRC .и остаток передается немедленно на линиию , начиная со старшего управляющего бита.
Например , вычисление СRC, написанное на языке "C".
/* Младший управляющий бит в 'crc' : */
/* старший управляющий коэффициент при вычислении CRC */int calcrc(ptr,count)
unsigned char *prt ;
int count ;
{
int crc,i;crc=0;
while(--count>=0) {
crc=crc^(int)*ptr++;
for(i=0;i<8;++i) {
if(crc&1)
crc=crc>>1^0x8408;
else
crc=crc>>1;
}
}
return(crc&0xffff);
}
---------------------------Смотрю монитором порта, получаю:
для блока данных:
CC 39 39 0E 02 52 30 30 30 31 30 31 30 39 39 39 39 39 39 39 39 39 39CRC - 88 C2
для блока данных:
CC 39 39 0E 02 52 30 30 30 31 30 31 30 31
31 31 31 31 31 31 31 31 31CRC - 33 0D
Ну не как не получается по этомй примеру таких CRC.
1. Может эта программа не соответствует алгоритму вычисления CRC? Может стоит посчитать вручную и сверить с выводом програмки:
#include <stdio.h>
int calcrc(unsigned char* ptr, int count)
{
int crc, i, num;
crc=0;
while(--count>=0)
{
printf("count=%d ", count);
printf("crc=0x%X ", crc);
num= *(ptr);
printf("num=0x%X ", num);
crc=crc^num;
printf("crc^num=0x%X ", crc);
for(i=0;i<8;++i)
{
printf("i=%d ", i);
if(crc&1)
{
crc=crc>>1^0x8408;
}
else
{
crc=crc>>1;
}
printf("crc>>?=0x%X ", crc);
}
ptr= ptr+1;
printf("\n");
}
return(crc&0xffff);
}
int main()
{
int _Tmp__Rslt_int;
unsigned char
_Tmp__B1[]= {
0xCC, 0x39, 0x39, 0x0E, 0x02,
0x52, 0x30, 0x30, 0x30, 0x31,
0x30, 0x31, 0x30, 0x39, 0x39,
0x39, 0x39, 0x39, 0x39, 0x39,
0x39, 0x39, 0x39 };_Tmp__Rslt_int= calcrc(_Tmp__B1, (sizeof(_Tmp__B1)) );
printf("crc= %X", _Tmp__Rslt_int);
printf("\n");
return 0;
}
> crc=crc^(int)*ptr++;Voobsche to u vas ptr eto ukazatel' na char (razmer=1).
Poetomu ptr++ znachi ptr+1, a ne ptr+2. T.e. esli peredat', skazhem 4 byta 0,1,2,3, to eto budet primerno sleduyuschee ( v zavismosti ot razmere int v baitah - pod DOS-om eto 2, a pod Linux - 4, koroche sizeof(int)):1. crc=crc^(0+256*1+...);
2. crc=crc^(1+2*256+...);
3. crc=crc^(2+3*256+...);
4. crc=crc^(3+?*256+...);Ili tak i nado? Ili ya s boduna chto to naputal?