Главная страница
    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.47 MB
Время: 0.044 c
15-1157535753
pavel_guzhanov
2006-09-06 13:42
2006.09.24
Где в настройках Delphi надо указать, чтобы при запуске


3-1153900271
miammiam
2006-07-26 11:51
2006.09.24
Нужно перенести данные из одной DBF в другую DBF таблицу


5-1139847378
TVV
2006-02-13 19:16
2006.09.24
Использование компонент из DLL


1-1155565173
lorn
2006-08-14 18:19
2006.09.24
Испытываю трудности со сборкой Crystal Reports 10 VCL


15-1157356316
ANB
2006-09-04 11:51
2006.09.24
Понедельничная задачка (Оракл)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский