Главная страница
    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.041 c
2-1157378897
_Gras_
2006-09-04 18:08
2006.09.24
не создавать дочернюю форму


2-1157610368
worldmen
2006-09-07 10:26
2006.09.24
Востановление системных файлов в XP


15-1157452423
Konstantin555
2006-09-05 14:33
2006.09.24
HELP! Как разблокировать CD-ROM?!


15-1157608263
Маска
2006-09-07 09:51
2006.09.24
Распространение приложений MS Visual Studio .NET


3-1153320083
SamProf
2006-07-19 18:41
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский