реклама на сайте
подробности

 
 
> Свойства CRC16(Modbus), почему так?
AlexOr
сообщение Jul 20 2010, 05:07
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 89
Регистрация: 30-12-04
Из: Санкт-Петербург
Пользователь №: 1 754



Введение
1. Рассчитаем CRC16(Modbus) (см. тут On-line CRC calculation http://www.lammertbies.nl/comm/info/crc-calculation.html) от двух байт 0x01, 0х02. Получаем значение 0xE181.
2. А теперь рассчитаем CRC16(Modbus) от четырех байт 0x01, 0х02, 0x81, 0xE1 (добавили младший и старший от ранее рассчитанного CRC). Получаем значение 0x0000.
ДА именно 0x0000 и байты 0x01, 0х02 можно заменить на любые (при выполнении 1 и 2). Все равно будет 0x0000.
Что это за свойство и неужели все про него знают? Я не знал.
Как называется это свойство и вообще подобные свойства? Есть ли подобные свойства при другом полиноме? А у CRC32?


Итог
История применения CRC16(Modbus)
Был на скорую руку сделан протокол с разделением пакетов по специальному символу. Соответственно был применен байт-стаффинг. В общем, длина пакета определяется по количеству байт до специального символа и далее сразу рассчитывается CRC для проверки пакета. Было выявлено, что при наличии интенсивных помех в канале связи, происходит добавление нулей в принимаемую последовательность и иногда вместо приема 0x01, 0х02, 0x81, 0xE1 получатся прием 0x01, 0х02, 0x81, 0xE1, 0х00 , 0х00.
!!!!!!!!!!!!!!!!!!!!!!!!!!!
А так как мы считаем два последних байта значением CRC, то такой неверный пакет проходит как правильный.
!!!!!!!!!!!!!!!!!!!!!!!!!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
VslavX
сообщение Jul 20 2010, 05:51
Сообщение #2


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(AlexOr @ Jul 20 2010, 08:07) *
ДА именно 0x0000 и байты 0x01, 0х02 можно заменить на любые (при выполнении 1 и 2). Все равно будет 0x0000.

Именно так - всегда будет ноль. Это свойство СRC как остатка от полиномиального деления. То есть - вы взяли произвольную битовую последовательность, поделили ее на полином, получили некоторый остаток (пункт 1 в Вашем описании). Потом Вы взяли получившийся остаток добавили к последовательности и снова поделили, результирующий остаток ессно будет ноль.
Если привести аналогию (не совсем корректную) к обычной (не полиномиальной арифметике). То у Вас было число S (исходная последовательность), Вы его поделили на некоторое P (полином), получили остаток D. То есть S = N*P + D. А потом Вы вычли из S остаток D и получили новое число S' = S-D. Ессно S' будет нацело делиться на P и остаток всегда будет 0. И при такой операции совершенно неважно какое у Вас было изначальное S - итоговый остаток всегда 0.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 05:47
Рейтинг@Mail.ru


Страница сгенерированна за 0.01367 секунд с 7
ELECTRONIX ©2004-2016