Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.24;
Скачать: CL | DM;

Вниз

подсчет CRC методом XOR   Найти похожие ветки 

 
usrd   (2006-08-09 13:51) [0]

Есть железяка с которой я пытаюсь общаться. Посылаю ему вот таку структуру:
 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. Посмотрите, может чего я не правильно делаю, плз.


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

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


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

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


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

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


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

т.е. i:=1


 
MBo ©   (2006-08-09 14:08) [5]

бит или байт?


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

сори ... байт


 
MBo ©   (2006-08-09 14:34) [7]

TTRKMsg = packed record
...

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:44) [8]

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

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


 
Slym ©   (2006-08-09 14:49) [9]

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


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

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

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

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

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

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

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


 
clickmaker ©   (2006-08-09 17:31) [11]

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


 
evvcom ©   (2006-08-09 17:46) [12]

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

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

24 байта!


 
Ketmar ©   (2006-08-09 18:17) [13]

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


 
han_malign ©   (2006-08-09 18:22) [14]

в большинстве случаев(в моей практике), 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;


 
Anatoly Podgoretsky ©   (2006-08-09 19:41) [15]

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



Страницы: 1 вся ветка

Текущий архив: 2006.09.24;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.028 c
2-1157309063
иван8511
2006-09-03 22:44
2006.09.24
Печать на матричный принтер.


2-1157688809
Балбес
2006-09-08 08:13
2006.09.24
Клавиатурные сокращения в дизайне


1-1155092687
Avgust
2006-08-09 07:04
2006.09.24
Алгоритм запуска программы под админом


15-1157187204
Новичоккк
2006-09-02 12:53
2006.09.24
Можно ли откомпилировать проект без запуска Delphi


15-1157633263
syte_ser78
2006-09-07 16:47
2006.09.24
функция date