6 / 6 / 0
Регистрация: 07.10.2013
Сообщений: 96
|
|
1 | |
Расчет CRC16 для Modbus10.09.2017, 13:16. Показов 12316. Ответов 6
Метки нет (Все метки)
Здравствуйте.
Пишу расчет CRC16 для Modbus по описанию: http://piclist.ru/S-CRC16-RUS/CRC16.html 1. В регистр CRC заносится начальное значение FFFFh. 2. В конец сообщения добавляется 16 нулевых битов. 3. Содержимое регистра сдвигается влево на 1 бит, и в последнюю (нулевую) позицию заносится очередной, ещё не обработанный бит данных. 4. Если из регистра был выдвинут бит со значением "1", то содержимое регистра комбинируется по XOR с полиномом 8005h. Если значение бита равно "0", XOR не выполняется. 5. Шаги 3 и 4 выполняются, пока не будут обработаны все данные. 6. Окончательное содержимое регистра комбинируется по XOR со значением FFFFh. Вроде алгоритм работает, но результат не совпадает с верным. Расчитываю CRC16 для пакета 6 байт, результат должен быть 14988($3A8C), у меня получается 14014. В чем ошибка? Или может быть, описание алгоритма не совсем точное?
0
|
10.09.2017, 13:16 | |
Ответы с готовыми решениями:
6
Вычисление контрольной суммы CRC16 (Modbus) Расчет CRC с полиномом MODBUS Проблема с подсчетом CRC16 для Modbus Расчёт MODBUS CRC |
6 / 6 / 0
Регистрация: 07.10.2013
Сообщений: 96
|
||||||
17.09.2017, 12:06 [ТС] | 2 | |||||
Тема еще актуальна.
Решил взять другой, табличный метод расчёта CRC16 из того же источника. Там есть пример на Си, перевёл на Паскаль расчёт таблицы, возник один нюанс. Для полинома $1021 этот код работает верно, а для $8005, согласно Википедии есть 2 флага, RefIn и RefOut, оба имеют значение True. Где это нужно учитывать в расчётах?
0
|
225 / 80 / 35
Регистрация: 01.04.2017
Сообщений: 182
|
||||||
17.09.2017, 15:59 | 3 | |||||
В свое время нарытый в интернете код
Кликните здесь для просмотра всего текста
При вызове CRC16Reverse полином надо отразить при помощи Reflect. Работает правда медленнее табличных вариантов, но за то правильно, по крайней мере с викой совпадает
1
|
6 / 6 / 0
Регистрация: 07.10.2013
Сообщений: 96
|
||||||
19.09.2017, 15:22 [ТС] | 4 | |||||
Спасибо, да, этот код работает, результат совпадает. Но всё-таки хотелось бы написать свой алгоритм, хотя бы для практики написания алгоритмов вообще и CRC, в частности.
Так что построение таблицы всё ещё актуально. Вот написал свою функцию инвертирования порядка бит, проверял отдельно - работает верно. Согласно Википедии должно быть так: -начало и направление вычислений: начиная с младшего значащего бита; -порядок битов регистра инвертируется при входе на элемент XOR. Кликните здесь для просмотра всего текста
Пробовал и там и там и вместе и по отдельности - результат неудовлетворительный. Начало таблицы должно быть таким: 0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,... Куда же подставлять функцию invert?
0
|
225 / 80 / 35
Регистрация: 01.04.2017
Сообщений: 182
|
||||||
19.09.2017, 17:40 | 5 | |||||
Я как-бы тоже не сидел без дела, и нашел сайт с которого утащил тот код
CRC calculations - там и табличный вариант есть, а еще CRC8 и CRC32 (да и вообще калькулятор интерестный) Таблица по идее глобальна - ее размер всего-то 1кб, ну разве что при каждом новом ключе ее надо будет пересчитать. По поводу инверсии на пальцах сложно обьяснить, да и не математик я. Но как я понимаю, для инверсного варианта мы обращаем полином и меняем направление просмотра бит в сообщении. Само сообщение переворачивать в таком случае не требуется.
1
|
6 / 6 / 0
Регистрация: 07.10.2013
Сообщений: 96
|
|
21.09.2017, 15:27 [ТС] | 6 |
Нашёл в чём загвоздка. В Википедии приведена методика Ross N. Williams, а я использую какую-то другую методику. Много их, оказывается. Т. е. функцию invert надо подставлять не туда, куда я пробовал. Но, думаю, дело всё-таки в инверсии порядка бит в определённом месте вычислений.
Спасибо за наводку, мне действительно сейчас нужна помощь математиков или криптографов.
0
|
0 / 0 / 0
Регистрация: 18.12.2018
Сообщений: 1
|
|||||||||||
03.09.2019, 12:21 | 7 | ||||||||||
Я конечно некропостер, но бился и подобной проблемой, правда для расчета CRC8.
Вот мое рабочее решение. Ниже приведены функции прямого и реверсного расчета. В данные функции как параметр передаются массив байт а не строка.
До кучи, если кому понадобится.
0
|
03.09.2019, 12:21 | |
03.09.2019, 12:21 | |
Помогаю со студенческими работами здесь
7
Найти crc16 для числа Подсчет crc16 для битовой последовательности Полином для расчёта crc16 udp пакета OPC сервер для Modbus Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |