Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

подсчет CRC методом XOR [D7, WinXP]


usrd ©   (2006-08-09 13:51:00) 

Есть железяка с которой я пытаюсь общаться. Посылаю ему вот таку структуру:
 TTRKMsg = record
 Sbyte : Byte ;
 device_no : array[0..1] of char ;
 Command : char ;
 SBuffer : Byte ;
 a : array [0..5] of Char ;
 b : array [0..5] of char ;
 Error : array[0..1] of char ;
 Request : array[0..1] of char ;
 EBuffer : Byte ;
 CRC : Byte ;

CRC считаю так:

type
 tBytes= array[0..23] of byte;
 pBytes= ^tBytes;

function CalcCRC(xBuff:TTRKMsg):byte;
var P:pBytes;
   i: byte;
begin
 P:=@xBuff;
 Result:=0;
 for i:=1 to sizeOf(xBuff)-1 do begin
   Result:=Result xor P^[i];
 end;
end;

Приходит ответ: устройство мне сообщает, что не верная сумма CRC. Посмотрите, может чего я не правильно делаю, плз.


Anatoly Podgoretsky   (2006-08-09 19:41:00) [1]

Запись не упакована, отсюда куча вариантов ее заполнения, в зависимости от версии Дельфи и настроек.
ShowMessage(IntToStr(SizeOf(TTRKMsg )))


han_malign   (2006-08-09 18:22:00) [2]

в большинстве случаев(в моей практике), CRC надо было инициализировать $FF...

function CalcCRC(const xBuff:TTRKMsg):byte;
var __xBuff: array[byte]of byte absolute xBuff;
    i: byte;
begin
   Result:=$FF;
   for i:=sizeof(xBuff.Sbyte) to (sizeOf(xBuff)-1)-sizeof(xBuff.CRC) do begin
       Result:=Result xor __xBuff[i];
   end;
end;


Ketmar   (2006-08-09 18:17:00) [3]

оффтоп: что интересно -- эта фигня вообще не имеет никакого отношения к crc. %-)


evvcom   (2006-08-09 17:46:00) [4]

Что-то я в твоей структуре TTRKMsg насчитал всего 23 байта, а в

> tBytes= array[0..23] of byte;

24 байта!


clickmaker   (2006-08-09 17:31:00) [5]

интересно... вот посчитал crc, а потом записал его в структуру. Получается, что этим ты ее CRC изменил. Замкнутый круг, однако. Наверно, она все-таки не должна учитываться


usrd   (2006-08-09 14:56:00) [6]

>> Slym тоже вариант, но ...

вот я тут перед тем как считать CRC, в структуре "обнулил" его, т.е.

было
Msg.CRC := CalcCRC(MSG) ;

теперь сделал:

Msg.CRC := 0 ;
Msg.CRC := CalcCRC(MSG) ;

Железо прекратило пять мне отвечать .... что-то я совсем запутался


Slym   (2006-08-09 14:49:00) [7]

а если с конца начать? downto


usrd   (2006-08-09 14:44:00) [8]

Логично, CRC считать не есть резонно, но опять же вот выдержка:
" Подсчет байта контрольной суммы сообщения (поле CRC) производится путём выполнения операции XOR (исключаещее или) всех байтов сообщения, включая EBuffer, не включая SByte."

А если сделать цикл до SizeOf(TTrkMsg)-2, то железяка вообще отказывается реагировать на полсанное ей сообщение


MBo   (2006-08-09 14:34:00) [9]

TTRKMsg = packedrecord
...

var P: PByteArray;
  i: byte;
begin
P:=@xBuff;
Result:=0;
for i:=1 to sizeOf( TTRKMsg) - 2 do begin // 2 -поскольку поле CRC, полагаю, учитывать не надо
  Result:=Result xor P^[i];
end;


usrd   (2006-08-09 14:22:00) [10]

сори ... байт


MBo   (2006-08-09 14:08:00) [11]

бит или байт?


usrd   (2006-08-09 14:07:00) [12]

т.е. i:=1


usrd   (2006-08-09 14:05:00) [13]

>> я сделал i:=0 потому, что первый бит - стартовый, а он, как я писал выше, не учавствует при постчете.


MBo   (2006-08-09 14:03:00) [14]

for i:= 0to sizeOf(xBuff)-1


usrd   (2006-08-09 13:53:00) [15]

дополнение:
стартовый бит не должен считаться при подсчете контрольной суммы, т.е.
Sbyte : Byte ; не должен учитываться при подсчете


Наверх

Титульная страница Поиск, карта сайта Написать письмо