підрахунок CRC методом XOR
Є залізяка з якою я намагаюся спілкуватися. Посилаю йому ось таку структуру:
# XA0; TTRKMsg = record
# XA0; Sbyte. Byte;
# XA0; device_no. array [0..1] of char;
# XA0; Command. char;
# XA0; SBuffer. Byte;
# XA0; a. array [0..5] of Char;
# XA0; b. array [0..5] of char;
# XA0; Error. array [0..1] of char;
# XA0; Request. array [0..1] of char;
# XA0; EBuffer. Byte;
# XA0; CRC. Byte;
type
# XA0; tBytes = array [0..23] of byte;
# XA0; pBytes = ^ tBytes;
function CalcCRC (xBuff: TTRKMsg): byte;
var P: pBytes;
# XA0; # XA0; i: byte;
begin
# XA0; P: = @ xBuff;
# XA0; Result: = 0;
# XA0; for i: = 1 to sizeOf (xBuff) -1 do begin
# XA0; # XA0; Result: = Result xor P ^ [i];
# XA0; end;
end;
Приходить відповідь: пристрій мені повідомляє, що ні вірна сума CRC. Подивіться, може чого я не правильно роблю, плз.
доповнення:
стартовий біт не повинен вважатися при підрахунку контрольної суми, тобто
Sbyte. Byte; не повинен враховуватися при підрахунку
>> я зробив i: = 0 тому, що перший біт - стартовий, а він, як я писав вище, не бере участь при постчете.
TTRKMsg = packed record
.
var P: PByteArray;
# XA0; i: byte;
begin
P: = @ xBuff;
Result: = 0;
for i: = 1 to sizeOf (TTRKMsg) - 2 do begin // 2 -поскольку поле CRC, вважаю, враховувати не треба
# XA0; Result: = Result xor P ^ [i];
end;
Логічно, CRC рахувати не є резонно, але знову ж ось витяг:
"Підрахунок байта контрольної суми повідомлення (поле CRC) проводиться шляхом виконання операції XOR (ісключаещее або) всіх байтів повідомлення, включаючи EBuffer, не включаючи SByte."
А якщо зробити цикл до SizeOf (TTrkMsg) -2, то залізяка взагалі відмовляється реагувати на полсанное їй повідомлення
а якщо з кінця почати? downto
>> Slym теж варіант, але.
ось я тут перед тим як вважати CRC, в структурі "обнулив" його, тобто
Msg.CRC: = 0;
Msg.CRC: = CalcCRC (MSG);
Залізо припинило п'ять мені відповідати. щось я зовсім заплутався
цікаво. ось порахував crc, а потім записав його в структуру. Виходить, що цим ти її CRC змінив. Замкнуте коло, однако. Напевно, вона все-таки не повинна враховуватися
Щось я в твоїй структурі TTRKMsg нарахував всього 23 байта, а в
> TBytes = array [0..23] of byte;
24 байта!
оффтоп: що цікаво - ця фігня взагалі не має ніякого відношення до crc. % -)
в більшості випадків (в моїй практиці), CRC треба було ініціювати $ FF.
function CalcCRC (const xBuff: TTRKMsg): byte;
var __xBuff: array [byte] of byte absolute xBuff;
# XA0; # XA0; i: byte;
begin
# XA0; # XA0; Result: = $ FF;
# XA0; # XA0; for i: = sizeof (xBuff.Sbyte) to (sizeOf (xBuff) -1) -sizeof (xBuff.CRC) do begin
# XA0; # XA0; # XA0; # XA0; Result: = Result xor __xBuff [i];
# XA0; # XA0; end;
end;
Запису не упакована, звідси купа варіантів її заповнення, в залежності від версії Дельфі і налаштувань.
ShowMessage (IntToStr (SizeOf (TTRKMsg)))
Пам'ять: 0.74 MB
Час: 0.095 c