- Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
- Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
- Не надо писать свой вопрос в первую попавшуюся тему - всегда лучше создать новую тему.
- За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения. Непонятно? - Читать здесь.
- Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
- Перед тем как что-то написать - читать здесь, а затем здесь и здесь.
- Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.
Вычисление CRC с зеркальным значением полинома.
Модератор: Глоб.модераторы
-
- здесь недавно
- Сообщения: 4
- Зарегистрирован: 04 мар 2015, 00:38
- Имя: Шульгин Юрий Николаевичь
Вычисление CRC с зеркальным значением полинома.
При вычислении CRC используется как прямое значение полинома, так и зеркальное (обратное). Везде пишется, что зеркальное значение применяется там, где биты из байта передаются младшим разрядом вперёд. Сама по себе такая связка понятна, вычислений меньше. Но для меня не понятна следующая ситуация. Вот UART передаёт младшие биты вперёд, но, если на другом конце стоит тоже UART, то принятый байт будет правильным и при его использовании в вычислении CRC биты будут в том же порядке, как и исходного байта и, соответственно, зеркального вычисления не требуется. Вывод один (может он и не правилен): зеркальное вычисление нужно там, где приёмник и передатчик имеют разные способы передачи бит из байта. Например: одно из устройств имеет UART, а другое нет и организовывает передачу или приём бит программным способом, при чём старшими битами вперёд.
Подскажите, правильно ли я мыслю, или что-то ещё не учитываю?
Подскажите, правильно ли я мыслю, или что-то ещё не учитываю?
-
- частый гость
- Сообщения: 409
- Зарегистрирован: 20 ноя 2012, 13:45
- Имя: :.О.N.Ф
- Страна: Россия
- Благодарил (а): 3 раза
- Поблагодарили: 7 раз
Re: Вычисление CRC с зеркальным значением полинома.
А там разве побайтово биты задом наперёд передаются, а не вся посылка?
«Сразу видно внимание к каждой мелочи, неиспорченным не осталось ничто».
-
- здесь недавно
- Сообщения: 4
- Зарегистрирован: 04 мар 2015, 00:38
- Имя: Шульгин Юрий Николаевичь
Re: Вычисление CRC с зеркальным значением полинома.
Конечно, вся посылка передаётся целиком, но побайтно, вспомните: стартовый и стоповый биты, бит паритета. В общем слчае строка может передаваться и частями, если нет временных разделителей посылок, как в ModBus-е.Exactamente писал(а):А там разве побайтово биты задом наперёд передаются, а не вся посылка?
-
- частый гость
- Сообщения: 462
- Зарегистрирован: 31 июл 2010, 09:12
- Имя: Павел
- Страна: РФ
- Благодарил (а): 10 раз
- Поблагодарили: 17 раз
Re: Вычисление CRC с зеркальным значением полинома.
Можно поподробнее? Приведите, пожалуйста, пример такого алгоритма. И, желательно, ссылку на код. Лично мне алгоритмы CRC с "зеркальным" значением не попадались.Yuriy48 писал(а):При вычислении CRC используется как прямое значение полинома, так и зеркальное (обратное).
Ваш вывод вполне логичен, но сама по себе система, где узлы используют UART с разным порядком бит, будет выполнять большой объем лишней работы. Ведь CRC обычно составляет малую часть от длины сообщения. Ну, допустим, получили вы зеркальное отражение контрольной суммы "бесплатно", прямо из алгоритма. Но вам все равно придется делать зеркальное отражение каждого байта полезной нагрузки - или при приеме, или при передаче. Выглядит как экономия "на спичках".Yuriy48 писал(а): Везде пишется, что зеркальное значение применяется там, где биты из байта передаются младшим разрядом вперёд. Сама по себе такая связка понятна, вычислений меньше. Но для меня не понятна следующая ситуация. Вот UART передаёт младшие биты вперёд, но, если на другом конце стоит тоже UART, то принятый байт будет правильным и при его использовании в вычислении CRC биты будут в том же порядке, как и исходного байта и, соответственно, зеркального вычисления не требуется. Вывод один (может он и не правилен): зеркальное вычисление нужно там, где приёмник и передатчик имеют разные способы передачи бит из байта. Например: одно из устройств имеет UART, а другое нет и организовывает передачу или приём бит программным способом, при чём старшими битами вперёд.
Подскажите, правильно ли я мыслю, или что-то ещё не учитываю?
Может, речь идет о каких-то трюках с аппаратными вычислителями CRC?
-
- частый гость
- Сообщения: 409
- Зарегистрирован: 20 ноя 2012, 13:45
- Имя: :.О.N.Ф
- Страна: Россия
- Благодарил (а): 3 раза
- Поблагодарили: 7 раз
Re: Вычисление CRC с зеркальным значением полинома.
ну, для определённости пусть настройки с 8 databits, остальное неважно, тогда если пакет у отправителя (цифры - сквозная нумерация битов):Yuriy48 писал(а):Конечно, вся посылка передаётся целиком, но побайтно, вспомните: стартовый и стоповый биты, бит паритета. В общем слчае строка может передаваться и частями, если нет временных разделителей посылок, как в ModBus-е.Exactamente писал(а):А там разве побайтово биты задом наперёд передаются, а не вся посылка?
[0..7][8..16]...
то отправляется, насколько я понимаю, в таком порядке:
[16..8][stop][7..0]
а вы предполагаете, что отправляется так:
[7..0][stop][16..8]
В последнем случае, похоже, трюк с зеркальным полиномом не имеет смысла.
>Можно поподробнее? Приведите, пожалуйста, пример такого алгоритма
Ну так...
«Сразу видно внимание к каждой мелочи, неиспорченным не осталось ничто».
-
- здесь недавно
- Сообщения: 4
- Зарегистрирован: 04 мар 2015, 00:38
- Имя: Шульгин Юрий Николаевичь
Re: Вычисление CRC с зеркальным значением полинома.
MuadDib писал(а):Можно поподробнее? Приведите, пожалуйста, пример такого алгоритма. И, желательно, ссылку на код. Лично мне алгоритмы CRC с "зеркальным" значением не попадались.Yuriy48 писал(а):При вычислении CRC используется как прямое значение полинома, так и зеркальное (обратное).
http://bookfi.org/book/594892
https://ru.wikipedia.org/wiki/%D6%E8%EA ... te_note-25
https://ru.wikibooks.org/wiki/%D0%A0%D0 ... 0%B4#CRC-4
Ну кто хочет все эти зеркальные отображения, они только жизнь портят. Реально я с такими случаями не сталкивался, но в вопросе разобраться хочется. Получается так, что, если приёмник и передатчик биты передают по разному, то хочешь - не хочешь, экономь - не экономь, а программно их переставлять придётся, б-р-р-р-р. А вот контрольную сумму можно подсчитать без перестановки и до этой операции, используя простые алгоритмы с зеркальным значением полинома (см. ссылки выше). И, если всё будет ОК, то можно перейти и к перестановке. Практически все широко применяемые микросхемы, реализующие UART, биты передают младшими разрядами вперёд.Ваш вывод вполне логичен, но сама по себе система, где узлы используют UART с разным порядком бит, будет выполнять большой объем лишней работы. Ведь CRC обычно составляет малую часть от длины сообщения. Ну, допустим, получили вы зеркальное отражение контрольной суммы "бесплатно", прямо из алгоритма. Но вам все равно придется делать зеркальное отражение каждого байта полезной нагрузки - или при приеме, или при передаче. Выглядит как экономия "на спичках".Yuriy48 писал(а): Везде пишется, что зеркальное значение применяется там, где биты из байта передаются младшим разрядом вперёд. Сама по себе такая связка понятна, вычислений меньше. Но для меня не понятна следующая ситуация. Вот UART передаёт младшие биты вперёд, но, если на другом конце стоит тоже UART, то принятый байт будет правильным и при его использовании в вычислении CRC биты будут в том же порядке, как и исходного байта и, соответственно, зеркального вычисления не требуется. Вывод один (может он и не правилен): зеркальное вычисление нужно там, где приёмник и передатчик имеют разные способы передачи бит из байта. Например: одно из устройств имеет UART, а другое нет и организовывает передачу или приём бит программным способом, при чём старшими битами вперёд.
Подскажите, правильно ли я мыслю, или что-то ещё не учитываю?
Может, речь идет о каких-то трюках с аппаратными вычислителями CRC?
-
- частый гость
- Сообщения: 462
- Зарегистрирован: 31 июл 2010, 09:12
- Имя: Павел
- Страна: РФ
- Благодарил (а): 10 раз
- Поблагодарили: 17 раз
Re: Вычисление CRC с зеркальным значением полинома.
В статье по второй ссылке есть раздел:
Книжка по первой ссылке не качается. По третьей ссылке, в разделе CRC-4 мы видим такой код:
Этот алгоритм обрабатывает младшие 8 разрядов параметра value, причем обработка идет от старшего разряда к младшему. Как этот пример связан с вашим исходным утверждением?
Вы об этом аспекте спрашиваете?11. "Reflected" Table-Driven Implementations
Книжка по первой ссылке не качается. По третьей ссылке, в разделе CRC-4 мы видим такой код:
Код: Выделить всё
string CRCTableCell(int value)
{
int r;
r = (value << 8) & 0xFF00;
int shifted_Polinom = Polinom << (3+8); // 3 сдвига для дополнения полинома до размера 1 байта, 8 сдв. для заполнения нулями
for(byte j=0; j<8; j++)
{
if ((r & (1 << 15)) == 0x8000)
{
r ^= shifted_Polinom;
r = (r << 1);
}
else r = r << 1;
}
r = r >> 8;
return String.Format("0x{0:X2}", r);
}
Yuriy48 писал(а): При вычислении CRC используется как прямое значение полинома, так и зеркальное (обратное).
-
- частый гость
- Сообщения: 462
- Зарегистрирован: 31 июл 2010, 09:12
- Имя: Павел
- Страна: РФ
- Благодарил (а): 10 раз
- Поблагодарили: 17 раз
Re: Вычисление CRC с зеркальным значением полинома.
Боюсь, тут возникла некоторая путаница. Алгоритмы CRC трактуют сообщение как некое очень большое число. Начальный (нулевой) байт содержит старшие разряды этого числа, последний (n-1) байт - младшие. Иными словами, самый старший бит начального байта - это старший бит всего сообщения. Корректно было бы записать ваш пример с двухбайтовым сообщением так:Exactamente писал(а): ну, для определённости пусть настройки с 8 databits, остальное неважно, тогда если пакет у отправителя (цифры - сквозная нумерация битов):
[0..7][8..16]...
то отправляется, насколько я понимаю, в таком порядке:
[16..8][stop][7..0]
а вы предполагаете, что отправляется так:
[7..0][stop][16..8]
В памяти у отправителя:
[15..8][7..0]
Порядок битов в памяти не играет роли
Передача осуществляется в таком порядке:
[start-bit] [8..15] [stop-bit] [start-bit] [0..7] [stop-bit]
При передаче последовательности байтов через UART порядок байтов не меняется, но биты каждого байта передаются, как правило, начиная с младшего. Иными словами, чередование битов в линии передачи нарушается по сравнению с исходным числом-сообщением. Если используется аппаратная схема вычисления CRC, нарушение порядка передачи битов может вызывать нестыковки с традиционным "софтовым" алгоритмом.
-
- здесь недавно
- Сообщения: 4
- Зарегистрирован: 04 мар 2015, 00:38
- Имя: Шульгин Юрий Николаевичь
Re: Вычисление CRC с зеркальным значением полинома.
Во вложении дана статья не читающаяся по первой ссылке. Там всё довольно подробно описано про расчёт CRC.
Чвствую, что MuadDib суть проблемы ухватил. Теперь, двигаясь в этом же русле, принять бы окончательное решение по поставленном вопросу. С другой стороны, похоже, что вопрос перетекает в следующую плоскость: "А кто ни будь реально сталкивался с такой ситуацией?".
Чвствую, что MuadDib суть проблемы ухватил. Теперь, двигаясь в этом же русле, принять бы окончательное решение по поставленном вопросу. С другой стороны, похоже, что вопрос перетекает в следующую плоскость: "А кто ни будь реально сталкивался с такой ситуацией?".
У вас нет необходимых прав для просмотра вложений в этом сообщении.