Форум: "Основная";
Текущий архив: 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.058 c