Вверх ↑
Этот топик читают: Гость
Ответов: 8974
Рейтинг: 824
#1: 2016-02-06 00:12:02 ЛС | профиль | цитата
Пытался посчитать CRC-8 по полиному X^8+X^5+X^4+1 и никак не сходится с примером Кто подскажет
В схеме 7-ми байтное слово и его CRC-8 к которому я стремился code_36909.txt
карма: 19

0
файлы: 1code_36909.txt [2.8KB] [1019]
Ответов: 16884
Рейтинг: 1239
#2: 2016-02-06 10:25:01 ЛС | профиль | цитата
Не вникал, но 0х28 это не 28.
0;0;7;67;116;128;28
0;0;7;67;116;128;40
В 0:12 спать надо.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 8974
Рейтинг: 824
#3: 2016-02-06 10:45:53 ЛС | профиль | цитата
Tad, ой, и правда (и что 40, и что спать надо)
Но, зараза, всё равно не сходится что-то я перемудрил, наверное надо табличку рисовать
карма: 19

0
Ответов: 9906
Рейтинг: 351
#4: 2016-02-06 17:25:44 ЛС | профиль | цитата
Если честно, мне не удалось смекнуть, откуда ты, Леонид, сей алгоритм срисовал
По моему -- полная фигня

Я считал так:
Add(MainForm,8053393,63,119)
{
Width=425
link(onCreate,7458483:doWork1,[(382,139)])
}
Add(InlineCode,3185247,322,210)
{
@Hint=#16:Вычисление CRC-8|
WorkPoints=#5:doCRC|
EventPoints=#5:onCRC|
DataPoints=#7:DataStr|3:Pol|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses kol,Share,Windows,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|4: |9: public|18: Pol:THI_Event;|22: DataStr:THI_Event;|20: onCRC:THI_Event;|0:|49: procedure doCRC(var _Data:TData; Index:word);|5: end;|0:|14:implementation|0:|28:procedure THiAsmClass.doCRC;|23:var _Str:string; // Код|29: i,j,_Pol,CRC,_Len: dword;|5:begin|36: _Str := ReadString(_Data,DataStr);|23: _Len := Length(_Str);|39: _Pol := ReadInteger(_Data,Pol) shl 8;|12: CRC := 0;|31: for i := 1 to _Len+1 do begin|31: CRC := CRC + byte(_Str[i]);|28: for j := 1 to 8 do begin|23: CRC := CRC shl 1;|55: if (CRC and $10000) > 0 then CRC := CRC xor _Pol;|8: end;|6: end;|32: _hi_onEvent(onCRC, CRC shr 8);|4:end;|0:|4:end.|
link(onCRC,948309:doEvent1,[])
link(DataStr,6074944:Var2,[])
link(Pol,14291107:Var2,[])
}
Add(Button,6635670,63,77)
{
Left=5
Top=80
Caption="Calc CRC"
link(onClick,12901376:doEvent1,[])
}
Add(Edit,8697974,154,28)
{
Left=80
Top=80
Width=200
Text="00 00 07 43 74 80 28"
}
Add(Label,4071037,455,210)
{
Left=295
Top=85
}
Add(Str_Enum,538753,154,84)
{
Delimiter=" "
link(onEnum,15502212:doConvert,[])
link(onEndEnum,3185247:doCRC,[(200,97)(200,216)])
link(String,8697974:Text,[])
}
Add(Hub,12901376,112,77)
{
link(onEvent1,8195036:doClear,[(137,83)(137,76)(298,76)(298,97)])
link(onEvent2,538753:doEnum,[])
}
Add(StrCat,8195036,322,84)
{
Point(doClear)
link(Str1,6074944:Var1,[(328,75)(314,75)(314,124)])
}
Add(Convertor,9339678,259,84)
{
Mode=4
link(onResult,8195036:doStrCat,[])
}
Add(GetDataEx,6074944,322,119)
{
link(Data,8195036:Result,[])
}
Add(Edit,11422416,329,147)
{
Left=95
Top=45
Text="305"
DataType=2
link(onChange,7458483:doWork2,[])
}
Add(Convertor,4337718,406,147)
{
Mode=8
link(onResult,13278715:doText,[])
link(Data,14291107:Var3,[(412,138)(398,138)(398,194)])
}
Add(Label,13278715,455,147)
{
Left=160
Top=50
}
Add(Label,9900214,406,84)
{
Height=30
Caption="10010100\r\nCRC8"
AutoSize=1
}
Add(Label,13341461,455,84)
{
Left=65
Caption="00000000000000000000011101000011011101001000000000101000"
}
Add(Convertor,2835844,406,266)
{
Mode=8
Digits=8
link(onResult,4969108:doText,[])
}
Add(Label,4969108,455,266)
{
Left=295
Top=110
}
Add(Hub,948309,371,210)
{
link(onEvent1,6450224:doConvert,[])
link(onEvent2,2835844:doConvert,[(396,223)(396,272)])
}
Add(GetDataEx,14291107,329,189)
{
link(Data,11422416:Text,[])
}
Add(HubEx,7458483,378,147)
{
link(onEvent,4337718:doConvert,[])
}
Add(Convertor,15502212,210,84)
{
Mode=5
link(onResult,9339678:doConvert,[])
}
Add(Convertor,6450224,406,210)
{
Mode=6
link(onResult,4071037:doText,[])
}
С этим online-calculator-ом сходится, вроде бы.
crc_example.png
И делался по:
Алгоритму из Букваря
Загрузим регистр нулевыми битами
Дополним хвостовую часть сообщения W нулевыми битами
While (пока еще есть необработанные биты)
  Begin
    Сдвинем регистр на 1 бит влево и поместим очередной
      еще не обработанный бит из сообщения в 0 позицию регистра.
    If (из регистра был выдвинут бит со значением "1")
      Регистр = Регистр XOR Полином
  End
Теперь в регистре содержится остаток

карма: 9

0
файлы: 1crc_example.png [33.1KB] [1370]
Ответов: 8974
Рейтинг: 824
#5: 2016-02-06 19:14:43 ЛС | профиль | цитата
Galkov писал(а):
По моему -- полная фигня
По моему тоже, хотя что-то считает. Этот был последний, который я пробовал и уже хотел стреляться, но вспомнил, что у нас есть Galkov! И не ошибся Спасибо!
(Я располагал принятые биты по описанию из datasheet-а, по коду семейства продукции 28h, но кто же мог предположить, что они читают по-Tadски! Думаю Galkov не мог ошибиться, начал крутить сначала байты, потом биты, вот методом тыка и пришла удача )
ВсёНаоборот.jpg
карма: 19

0
файлы: 1ВсёНаоборот.jpg [53.8KB] [1333]
Ответов: 9906
Рейтинг: 351
#6: 2016-02-06 19:52:36 ЛС | профиль | цитата
Кстати, вот небольшая книжка по CRC и магические полиномы (не помню где скачивал)
карма: 9

2
файлы: 1crcbook.rar [162.6KB] [838]
Голосовали:Леонид, Tad
Ответов: 203
Рейтинг: 5
#7: 2025-09-16 12:02:03 ЛС | профиль | цитата
fix

Редактировалось 2 раз(а), последний 2025-09-16 14:30:48
карма: 1

0
Ответов: 203
Рейтинг: 5
#8: 2025-11-12 09:18:30 ЛС | профиль | цитата
Проверенный на надежность модуль подсчета контрольной суммы CRC8:
Add(MainForm,2953706,301,287)
{
Caption="CRC8"
link(onCreate,16407008:doWork1,[])
}
Add(MultiElement,16407008,462,301)
{
@Hint=#11:Расчет CRC8|
@Color=43775
link(onEvent1,9823037:doText,[])
link(Data1,9666168:Text,[])
link(Data2,10015156:Text,[(475,265)(410,265)])
AddHint(49,-29,81,13,@Hint)
}
BEGIN_SDK
Add(EditMulti,7362095,21,21)
{
EventCount=1
WorkCount=1
DataCount=2
VarCount=1
Width=993
Height=466
VOffset=50
HOffset=50
link(doWork1,16567277:In,[(42,77)(42,146)])
link(Var1,2276336:Var,[(77,463)(671,463)])
}
Add(For,11752186,413,294)
{
@Hint=#1:j|
End=7
link(onEvent,1514402:doOperation,[])
AddHint(-6,42,17,13,@Hint)
}
Add(Math,1514402,469,294)
{
OpType=4
Op2=128
ResultType=0
link(onResult,13570674:doCase,[])
link(Op1,13974006:Var2,[])
}
Add(Case,13570674,511,294)
{
Value=Integer(0)
link(onNextCase,5957441:doCalc,[])
link(onTrue,15339565:doCalc,[])
AddHint(-3,40,21,13,Value)
}
Add(GetDataEx,5254677,602,252)
{
link(Data,16021543:Value,[])
}
Add(Memory,16021543,602,217)
{
@Hint=#17:CRC (Init = 0xFF)|
Default=Integer(255)
AddHint(-9,-41,95,13,@Hint)
AddHint(64,5,33,13,Default)
}
Add(GetDataEx,13974006,469,252)
{
Angle=1
link(Data,5254677:Var1,[])
}
Add(Hub,2711622,511,217)
{
InCount=2
OutCount=1
link(onEvent1,16021543:doValue,[])
}
Add(GetDataEx,11993642,602,273)
{
link(Data,5254677:Var2,[])
}
Add(MathParse,5957441,574,294)
{
DataCount=1
MathStr="%1<<1"
ResultType=0
link(onResult,4875133:doOperation,[])
link(X1,11993642:Var1,[(580,278)])
}
Add(GetDataEx,13474536,665,273)
{
Angle=3
link(Data,11993642:Var3,[])
}
Add(MathParse,15339565,623,301)
{
DataCount=1
MathStr="%1<<1"
ResultType=0
link(onResult,984673:doWork3,[(662,307)])
link(X1,13474536:Var1,[(629,267)(671,267)])
}
Add(Hub,4270491,525,350)
{
link(onEvent1,2276336:doConvert,[])
link(onEvent2,16021543:doClear,[(571,363)(571,230)])
}
Add(Math,4654115,413,217)
{
OpType=6
ResultType=0
link(onResult,2711622:doEvent1,[])
link(Op1,13974006:Var1,[(419,205)(453,205)(453,257)])
}
Add(Hub,4170178,371,217)
{
link(onEvent1,4654115:doOperation,[])
link(onEvent2,11752186:doFor,[(399,230)(399,300)])
}
Add(Str_Enum,10434258,273,217)
{
Delimiter=""
Step=2
OnlyDivGroup=1
link(onEnum,744170:doConvert,[])
link(onEndEnum,4270491:doEvent1,[(365,230)(365,356)])
link(String,7362095:Data2,[(279,119)(84,119)])
}
Add(Convertor,744170,322,217)
{
Mode=5
link(onResult,4170178:doEvent1,[])
}
Add(Math,15104786,728,294)
{
@Hint=#7:polynom|
OpType=6
ResultType=0
link(onResult,984673:doWork2,[(776,300)(776,272)])
link(Op2,12598407:Var,[])
AddHint(47,1,54,13,@Hint)
AddHint(56,30,30,13,Op2)
}
Add(HubEx,984673,658,266)
{
Angle=2
link(onEvent,2711622:doEvent2,[(506,272)(506,230)])
}
Add(Math,4875133,679,294)
{
OpType=4
Op2=255
ResultType=0
link(onResult,15104786:doOperation,[])
}
Add(ConvertorEx,2276336,665,350)
{
Mode=6
link(onResult,7362095:onEvent1,[(855,356)(855,77)])
link(Data,13474536:Var2,[])
}
Add(LineBreak,595914,98,63)
{
Caption="plnm"
Type=1
Color=16711935
link(Data,7362095:Data1,[(104,42)(77,42)])
Primary=[12598407,637,203]
}
Add(LineBreak,1474782,203,217)
{
Caption="do_crc"
link(Out,10434258:doEnum,[])
Primary=[16567277,-140,-77]
}
END_SDK
Add(Edit,9666168,462,196)
{
Left=120
Top=15
Width=65
Text="49"
}
Add(Label,10548095,462,140)
{
Left=30
Top=20
Width=81
Height=17
Caption="Полином (DEC)"
}
Add(Edit,10015156,404,196)
{
Left=25
Top=100
Width=335
Text="00112233445566778899AABBCCDDEEFF"
}
Add(Label,7692834,410,133)
{
Left=30
Top=70
Width=167
Height=17
Caption="Строка байт для подсчета (HEX)"
}
Add(Edit,9823037,574,301)
{
Left=100
Top=135
Text=""
}
Add(Label,2532230,574,231)
{
Left=30
Top=140
Width=56
Height=17
Caption="Результат"
}


Версия на языке C/C++ (STM32)
uint8_t gencrc8 (uint8_t *data, size_t len)
{
uint8_t crc = 0xff; //Init
size_t i, j;
for (i = 0; i < len; i++) {
crc ^= data[i];
for (j = 0; j < 8; j++) {
if ((crc & 0x80) != 0)
crc = (uint8_t)((crc << 1) ^ 0x31); // 0x31 polynom
else
crc <<= 1;
}
}
return crc;
}

где 0x31 (49) - полином. Можно использовать другой Init = 0xFF.
Проверить подсчет можно тут: https://crccalc.com/?crc=00112233445566778899AABBCCDDEEFF&method=CRC-8&datatype=hex&outtype=hex

Редактировалось 4 раз(а), последний 2025-11-12 09:26:07
карма: 1

0
Ответов: 4671
Рейтинг: 767
#9: 2025-11-13 22:00:50 ЛС | профиль | цитата
Существующий компонент, вероятно, то же самое делает. Только реализация более быстрая - на базе предварительно рассчитанной таблицы. В базовом алгоритме те же значения таблицы постоянно пересчитываются.
карма: 26

0
Ответов: 203
Рейтинг: 5
#10: 2025-11-17 08:17:40 ЛС | профиль | цитата
Netspirit, а такой компонент разве есть? там только CRC16, CRC32.
карма: 1

0
Ответов: 4671
Рейтинг: 767
#11: 2025-11-18 22:48:15 ЛС | профиль | цитата
А, не заметил что речь о CRC8
карма: 26

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