Бьюсь сейчас с протоколом CCNET, там скорость всего одна но с подсчетом контрольной суммы заморочка снова.
Код есть на си и паскале, перевел его в баском с паскаля - фигня выходит, CRC не совпадает, хоть убей...
Вот код на си:
#define POLYNOMIAL 0x08408
unsigned int GetCRC16(unsigned char* bufData, unsigned int sizeData)
{
unsigned int TmpCRC, CRC, i;
unsigned char j;
CRC = 0;
for(i=0; i < sizeData; i++)
{
TmpCRC = CRC ^ bufData;
for(j=0; j < 8; j++)
{
if(TmpCRC & 0x0001) {TmpCRC >>= 1; TmpCRC ^= POLYNOMIAL;}
else TmpCRC >>= 1;
}
}
return CRC;
}
Вот на паскале:
const _CR_CCNET_CRC_POLY = $08408
function GetCRC16(InData: array of byte; DataLng: word): word;
var i,TmpCRC: word;
j: byte;
begin
result:=0;
for i:=0 to (DataLng-1) do
begin
TmpCRC:=result xor InData;
for j:=0 to 7 do
begin
if (TmpCRC and $0001)<>0 then
begin
TmpCRC:=TmpCRC shr 1;
TmpCRC:=TmpCRC xor _CR_CCNET_CRC_POLY;
end
else
TmpCRC:=TmpCRC shr 1;
end;
result:=TmpCRC;
end;
end;
Вот я на баскоме нарулил:
Crc:
Dlinna2 = Dlinna - 1
Result = 0
For I = 1 To Dlinna2
Nm = Indata(i)
Printbin Nm
Tmpcrc = Result Xor Nm
For J = 0 To 7
Tmpcrc1 = Tmpcrc And &H1
If Tmpcrc1 <> 0 Then
Shift Tmpcrc , Right , 1
Tmpcrc = Tmpcrc Xor cr_ccnet_crc_poly
Else
Shift Tmpcrc , Right , 1
End If
Next
Result = Tmpcrc
Next
If Result = Bytecrc Then
Commandrecived = 1
Else
Xorsumerror = 1
Printbin Result
End If
Return
Исходная строка байт -
02 03 06 33 DA 81 - последняя- 81 контрольная сумма.
Вот еще для примера:
000001 12:49:46.577 COM4 << 02 03 06 33 DA 81 ...3РЄРѓ
000002 12:49:46.593 COM4 >> 02 03 06 19 82 0F ....‚.
000003 12:49:46.593 COM4 << 02 03 06 33 DA 81 ...3РЄРѓ
000004 12:49:46.624 COM4 >> 02 03 06 19 82 0F ....‚.
000005 12:49:49.061 COM4 << 02 03 06 30 41 B3 ...0AС–
000006 12:49:49.093 COM4 >> 02 03 06 00 C2 82 ....В‚
000007 12:49:49.093 COM4 << 02 03 06 33 DA 81 ...3РЄРѓ
000008 12:49:49.108 COM4 >> 02 03 06 13 D8 A0 ....РЁВ
000009 12:49:49.108 COM4 << 02 03 06 00 C2 82 02 03 06 41 4F D1 ....В‚...AOС
Контроллер показывает CRC - 50
От отчаяния загрузил турбо паскаль, наваял код:
Program arr;
const
CR_CCNET_CRC_POLY = $08408;
var i,TmpCRC: word;
result: byte;
DataLng: word;
j: byte;
InData: array [0..5] of byte;
begin
InData[0]:= $2;
InData[1]:= $3;
InData[2]:= $6;
InData[3]:= $33;
InData[4]:= $da;
InData[5]:= $81;
DataLng := 6;
begin
result := 0;
for i := 0 to (DataLng-1) do
begin
TmpCRC := result xor InData;
for j := 0 to 7 do
begin
if (TmpCRC and $0001)<>0 then
begin
TmpCRC := TmpCRC shr 1;
TmpCRC := TmpCRC xor CR_CCNET_CRC_POLY;
end
else
TmpCRC := TmpCRC shr 1;
end;
result := TmpCRC;
end;
end;
writeln (result);
writeln (TmpCRc);
writeln (i);
writeln (j);
readln
end.
Тот вообще показывает результат - 4 :\'(
Бьюсь головой о клаву....