проблема вычисления crc8 под delphi

Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Ответить
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 167
Зарегистрирован: Вт ноя 23, 2010 04:18:10
Откуда: Bratsk Russia UIBB

Сообщение mikbur »

Здравствуйте, уважаемые.
возникла необходимость управления железом (С2000 фирмы БОЛИД). Ситуация следущая: с СОМ порта идут посылки вида :

7F 06 01 0D 00 00 BF
7F 06 01 53 00 00 30
02 06 01 01 00 00 D6
03 06 01 01 00 00 E1
04 06 01 01 00 00 64
05 06 01 01 00 00 53
....
где BF для первого случая и 30 для второго... являются CRC-8

перерыл весь инет не один из предложенных вариантов под delpi для вычисления crc не подходят.
Подскажите, люди добрые как посчитать crc :(

отталкивался от такого варианта :http://www.programmersforum.ru/showthread.php?t=110937

Код: Выделить всё

function GetCRC(S:String):String;
var i, j:integer;
    c:byte;
begin
   c := 0;
   for i := 1 to length(S) do begin
      c := c xor ord(S[i]);
      for j := 0 to 7 do begin
         if c and $80 = $80
         then c := (c shl 1) xor 1
         else c := (c shl 1);
      end;
   end;
   result := IntToHex(c, 4);
end;

edit1.text:=(GetCRC(chr($7F)+chr($06)+chr($01)+chr($0D)+chr($00)+chr($00));  
в итоге получаю 7C вместо BF
Реклама
Liv
Вымогатель припоя
Аватара пользователя
Сообщения: 525
Зарегистрирован: Сб сен 20, 2008 12:12:30
Откуда: Minsk

Сообщение Liv »

Вот этот код считает CRC правильно:

Код: Выделить всё

CRC: byte;

procedure DowCRC(b:Byte);
var i:Integer;
begin
 for i:=1 to 8 do
  begin
   if Odd(b xor CRC)
    then CRC:=((CRC xor $18) shr 1) or $80
    else CRC:=CRC shr 1;
   b:=b shr 1;
  end;
end;
Еще высылаю утилиту расчета CRC, только вводить строку нужно справа налево: 00000D01067F -> BF
Вложения
DS1990A.zip
(155.67 КБ) 541 скачивание
Контактная информация:
Реклама
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 167
Зарегистрирован: Вт ноя 23, 2010 04:18:10
Откуда: Bratsk Russia UIBB

Сообщение mikbur »

опять тупик не могу разобрвться куда вставлять в код свои значения для вычисления
Liv
Вымогатель припоя
Аватара пользователя
Сообщения: 525
Зарегистрирован: Сб сен 20, 2008 12:12:30
Откуда: Minsk

Сообщение Liv »

Как куда? Обнуляете переменную CRC, затем для каждого байта данных вызываете DowCRC():

СRC := 0;
DowCRC($7F);
DowCRC($06);
DowCRC($01);
DowCRC($0D);
DowCRC($00);
DowCRC($00);

Получаете CRC = $BF
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

Вернуться в «Интеграция с ПК»