Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рассчет контрольной суммы LRC 
:(
    Опции темы
Cergiy
Дата 15.4.2008, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 15.4.2008

Репутация: нет
Всего: нет



Приветствую всех!
Мне нужно для протокола 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;


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

Основная тема, для чего это нужно - здесь.
PM MAIL   Вверх
Poseidon
Дата 16.4.2008, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Я контрольную сумму считаю так:

Код
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;



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Cergiy
Дата 16.4.2008, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 15.4.2008

Репутация: нет
Всего: нет



Poseidon, Вы думаете если заменить файл на строчку, ну там типы переменных поменять, оно будет работать?
И это точно контрольная сумма LRC,  а не CRC? А то, я вижу, многие даже и не слышали о контрольной сумме LRC.
 Благодарю за внимание.
PM MAIL   Вверх
Virtuals
Дата 16.4.2008, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: 3
Всего: 11



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

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

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

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0622 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.