Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Рассчет контрольной суммы LRC


Автор: Cergiy 15.4.2008, 11:30
Приветствую всех!
Мне нужно для протокола MODBUS-ASCII, рассчитывать контрольную сумму LRC. У меня есть функция и мне нужно понять правильно ли она считает эту самую сумму.
Это пример на языке «С» (который приводится в описании прибора), но я его не знаю.

Код

unsigned char digchar(unsigned char v)
v-='0';
if(v>41) return v-39; /* a .. f */
if(v>9) return v-7; /* A .. F */
return v; /* 0 .. 9 */
}
unsigned char LRC(unsigned char *str)
{
unsigned char val=0;
while(*str)
{
val+=(digchar(*str)<<4)|digchar(str[1]);
str+=2;
}
return (unsigned char)(-((signed char)val));
}



А вот что у меня(из книжки П.Агуров «Последовательные интерфейсы ПК. Практика программирования») есть на Делфи.

Код

Function CalculateLRC (P: Pchar; Len: Word):Byte;
Var: i:word;
Begin
{$R-}
Result:=0;
For i:=0 to len-1 do
Result:=Result+Byte(Pointer(Longint(P)+i)^);
Result:=$FF-Result;
Inc(Result);
{$R+}
End;


Я сопоставить два этих когда не могу и поэтому сказать что-то не могу. Может кто-то занимался этой проблемой и у него есть свой РАБОЧИЙ код? 

Основная тема, для чего это нужно - http://forum.vingrad.ru/forum/topic-206444/anchor-entry1479600/0.html.

Автор: Poseidon 16.4.2008, 10:27
Я контрольную сумму считаю так:

Код
function GetCheckSum(FileName: string): DWORD;
var
 F: file of DWORD;
 P: Pointer;
 Fsize: DWORD;
 Buffer: array [0..500] of DWORD;
begin
 FileMode := 0;
 AssignFile(F, FileName);
 Reset(F);
 Seek(F, FileSize(F) div 2);
 Fsize := FileSize(F) - 1 - FilePos(F);
 if Fsize > 500 then Fsize := 500;
 BlockRead(F, Buffer, Fsize);
 Close(F);
 P := @Buffer;
 asm
    xor eax, eax
    xor ecx, ecx
    mov edi , p
    @again:
      add eax, [edi + 4*ecx]
      inc ecx
      cmp ecx, fsize
    jl @again
    mov @result, eax
  end;
end;

Автор: Cergiy 16.4.2008, 10:46
Poseidon, Вы думаете если заменить файл на строчку, ну там типы переменных поменять, оно будет работать?
И это точно контрольная сумма LRC,  а не CRC? А то, я вижу, многие даже и не слышали о контрольной сумме LRC.
 Благодарю за внимание.

Автор: Virtuals 16.4.2008, 13:24
Cergiy, LCR это контрольная сумма - обычная циклическая сумма всех байт отображенная 2мя символами
тоесть
если комманда

"061F01" то LCR = "26"
и вся комманда выглядит так

sendCMDa:= "061F0126" +#$0D +#$0A;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)