Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];

Вниз

подсчет 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.039 c
1-1155392466
!_SM_!
2006-08-12 18:21
2006.09.24
OnCreate, OnDestroy


2-1157114544
VitV
2006-09-01 16:42
2006.09.24
FastReport-подсчёт количества строк


2-1157627610
lessard
2006-09-07 15:13
2006.09.24
Определить содержимое variant


15-1157058254
!_SM_!
2006-09-01 01:04
2006.09.24
BTN%Copy%1 BTN%Copy%2


2-1157456734
Dok
2006-09-05 15:45
2006.09.24
MoveFile, MoveFileEx





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский