Вверх ↑
Этот топик читают: Гость
Ответов: 36
Рейтинг: 7
#1: 2011-04-18 16:31:59 ЛС | профиль | цитата
Подскажите как сделать вот такой генератор crc:

//-----------------crc8()-------------------------

uint8 crc8(uint8*buf, uint8 data_byte)
{
uint8 crc=0x00;
uint8 data_bit=0x80;

while(data_byte>0)
{
if(((crc&0x01)!=0)!=((buf[data_byte]&data_bit)!=0))
{
crc>>=1;
crc^=0xCD;
карма: 0

0
Разработчик
Ответов: 26324
Рейтинг: 2148
#2: 2011-04-18 16:40:30 ЛС | профиль | цитата
А вот это не пойдет -- http://www.hiasm.com/forum.html?q=3&p=183505#p183505
карма: 22

0
Ответов: 36
Рейтинг: 7
#3: 2011-04-19 13:36:45 ЛС | профиль | цитата
Прошу прощения, код не весь вставил:

#cpp
//-----------------crc8()-------------------------

uint8 crc8(uint8*buf, uint8 data_byte)
{
uint8 crc=0x00;
uint8 data_bit=0x80;

while(data_byte>0)
{
if(((crc&0x01)!=0)!=((buf[data_byte]&data_bit)!=0))
{
crc>>=1;
crc^=0xCD;
}
else crc>>=1;

data_bit>>=1;

if(!data_bit)
{
data_bit=0x80;
data_byte--;
}
}
return(crc);
}

nesco, спасибо, щас посмотрю
------------ Дoбавленo в 22.36:
А как определить полином?

Все что у меня есть - это кусок кода, построенный на побитовых операциях (см. выше).

Попробовал их повторить - только запутался:


Может можно куском кода как-нибудь вставить?
------------ Дoбавленo в 13.36:
Попытался сделать на Visual Basic, пишет Sintax Error.
А где - не пишет.



 for i = 0 to UBound(buf)
'if (((crc and 1) <> 0) <> ((buf(i) and data_bit) <> 0)) Then
if (((crc and 1) <> 0) <> ((Chr("&h" & buf(i)) and data_bit) <> 0)) Then
crc = crc >> 1
crc = crc Xor 205
else
crc = crc >> 1
End If

data_bit = data_bit >> 1

if (data_bit <> 0) Then

else
data_bit = 128
i = i - 1
End If
next
sys.onRes crc
End Sub

карма: 0

0
Разработчик
Ответов: 26324
Рейтинг: 2148
#4: 2011-04-19 14:02:37 ЛС | профиль | цитата
wasp, я не понял, тебе что, на дискретных элементах не устраивает, тебе нужен именно в кодах
Тогда пиши в InlineCode на Delphi
карма: 22

0
Ответов: 36
Рейтинг: 7
#5: 2011-04-19 15:04:34 ЛС | профиль | цитата
nesco, не поможешь вставить эту функцию как InlineCode, а то у меня ума не хватает.

Вот еще раз код с выводом промежуточных данных на терминал:

//buf - пакет данных (массив байт), data_byte - длина пакета
uint8 crc8(uint8*buf, uint8 data_byte)
{
uint8 crc=0x00;
uint8 data_bit=0x80;
uint8 i;

for(i=0;i<data_byte;i++)
printf("Buffer[%x] %x
",i,buf[i]);

while(data_byte>0)
{
if(((crc&0x01)!=0)!=((buf[data_byte]&data_bit)!=0))
{
crc>>=1;
printf("CRC>>=1---%x
",CRC);
crc^=0xCD;
printf("CRC^00xcd---%x
",CRC);
}
else crc>>=1;

data_bit>>=1;
printf("data_bit>>=1---%x
",data_bit);
if(!data_bit)
{
data_bit=0x80;
data_byte--;
printf("data_byte---%x
",data_byte);
}
}
return(crc);
}

вот что будет если массив состоит из одного элемента buf[0]=1:



да, можно и на дискретных элементах, но по-мойму кодом гораздо проще.
Только я Дельфи первый раз вижу и не дал ума как.

Спасибо

карма: 0

0
Ответов: 36
Рейтинг: 7
#6: 2011-04-25 14:28:57 ЛС | профиль | цитата
да, все принты только для наглядности

Спасибо
карма: 0

0
файлы: 1code_23414.txt [489B] [121]
Разработчик
Ответов: 26324
Рейтинг: 2148
#7: 2011-04-25 14:50:18 ЛС | профиль | цитата
wasp, сгенерируй нормальный CRC, для нормальной последовательности, в качестве проверочной, у себя на ПО
карма: 22

0
Ответов: 36
Рейтинг: 7
#8: 2011-04-25 15:13:27 ЛС | профиль | цитата
nesco, ну вот к примеру несколько пакетов, все в 16-ричном виде:

02 05 25 01 01 crc=51
02 05 25 FF FF crc=9E
02 05 25 01 00 crc=9F
02 05 25 02 00 crc=72
02 05 25 AA 55 crc=2A

пойдет?
карма: 0

0
Разработчик
Ответов: 26324
Рейтинг: 2148
#9: 2011-04-25 15:30:59 ЛС | профиль | цитата
wasp писал(а):
пойдет?

Вполне
------------ Дoбавленo в 15.30:
wasp, на, жуй, проверил, все совпадает



Add(MainForm,2953706,91,133)
{
}
Add(InlineCode,10687331,301,196)
{
@Hint=#9:Calc CRC8|
WorkPoints=#5:doCRC|
EventPoints=#8:onResult|
DataPoints=#4:Data|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|25: onResult: THI_Event;|21: Data: THI_Event;|50: procedure doCRC(var _Data:TData; Index:word);|5: end;|0:|14:implementation|0:|51:function CRC8(buf: PChar; data_byte: Byte): Byte; |3:var|12: crc: Byte;|17: data_bit: Byte;|1: |5:begin|14: crc := $00; |19: data_bit := $80; |24: while data_byte > 0 do|8: begin |77: if ((crc and $01) <> 0) <> ((ord(buf[data_byte]) and data_bit) <> 0) then|10: begin |24: crc := crc shr 1; |26: crc := crc xor $CD; |7: end|8: else|24: crc := crc shr 1; |0:|32: data_bit := data_bit shr 1; |4: |24: if data_bit = 0 then|10: begin |23: data_bit := $80; |22: dec(data_byte); |8: end;|6: end;|17: Result := crc; |4:end;|0:|0:|28:procedure THiAsmClass.doCRC;|3:var|12: s: string;|5:begin|31: s := ReadString(_Data, Data);|48: _hi_onEvent(onResult, crc8(@s[1], length(s)));|4:end;|0:|4:end.|
link(onResult,14058586:doConvert,[])
AddHint(58,-38,67,13,@Hint)
}
Add(Edit,6702273,203,140)
{
Left=100
Top=15
Width=275
Cursor=1
Text="02 05 25 01 01"
}
Add(Label,2171738,147,140)
{
Left=35
Top=20
Caption="Данные:"
AutoSize=1
}
Add(Edit,16716587,399,196)
{
Left=100
Top=45
Width=65
Cursor=1
Text=""
}
Add(Label,13632614,140,133)
{
Left=35
Top=45
Width=48
Height=17
Caption="CRC8:"
AutoSize=1
}
Add(Button,8885570,147,196)
{
Left=140
Top=80
Width=85
TabOrder=-1
Caption="Calc CRC8"
link(onClick,11566862:doReplace,[])
}
Add(Replace,11566862,203,196)
{
SubStr=" "
link(onReplace,9735071:doConvert,[])
link(Str,6702273:Text,[])
}
Add(StreamConvertor,9735071,252,196)
{
Mode=3
link(onResult,10687331:doCRC,[])
}
Add(Convertor,14058586,350,196)
{
Mode=6
link(onResult,16716587:doText,[])
}

карма: 22

1
Голосовали:wasp
Ответов: 36
Рейтинг: 7
#10: 2011-04-25 15:42:22 ЛС | профиль | цитата
nesco, спасибо огромное!

приятно, что есть еще люди, готовые помочь неизвестно кому!
карма: 0

0
Ответов: 8978
Рейтинг: 825
#11: 2011-04-25 21:16:33 ЛС | профиль | цитата
wasp, не "неизвестно кому", а коллеге под ником wasp
карма: 19

0
11
Сообщение
...
Прикрепленные файлы
(файлы не залиты)