Checksum, CRC8 и CRC16
-
Viktor
- expert
- Сообщения: 1408
- Зарегистрирован: 23 мар 2008, 10:56
- Награды: 4
- Версия LabVIEW: 2020
- Откуда: Санкт-Петербург
- Благодарил (а): 17 раз
- Поблагодарили: 3 раза
- Контактная информация:
Re: Checksum, CRC8 и CRC16
На всякий случай приложу описание этого девайса - там есть протокол обмена и алгоритм вычисления CRC.
Я следовал указаниям из этого документа, но получал совершенно не те значения CRC , которые там приведены в примере
Т. е. у меня всё работает, стоит подставить значения CRC из примера, но как его получить для другого сетевого адреса
Или в описании алгоритма ошибка(опечатка), или я зациклился и чего-то в упор не вижу
Я следовал указаниям из этого документа, но получал совершенно не те значения CRC , которые там приведены в примере
Т. е. у меня всё работает, стоит подставить значения CRC из примера, но как его получить для другого сетевого адреса
Или в описании алгоритма ошибка(опечатка), или я зациклился и чего-то в упор не вижу
-
Viktor
- expert
- Сообщения: 1408
- Зарегистрирован: 23 мар 2008, 10:56
- Награды: 4
- Версия LabVIEW: 2020
- Откуда: Санкт-Петербург
- Благодарил (а): 17 раз
- Поблагодарили: 3 раза
- Контактная информация:
Re: Checksum, CRC8 и CRC16
Неужели никто не поможет перевести СИ код в ?
http://www.labviewportal.org/viewtopic. ... =15#p25268
Там всего несколько строк
http://www.labviewportal.org/viewtopic. ... =15#p25268
Там всего несколько строк
-
mzu2006
- doctor
- Сообщения: 2456
- Зарегистрирован: 16 авг 2008, 02:12
- Награды: 3
- Версия LabVIEW: 7.1 10 11 12
- Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
- Контактная информация:
Re: Checksum, CRC8 и CRC16
В упор не понимаю зачем они сделали класс, занимающийся вычислением CRC. Я перенёс этот класс 1-в-1 на LabVIEW. Код подлежит серьёзной оптимизации
- Вложения
-
- ViktorCRC.zip
- (49.29 КБ) 345 скачиваний
Правила форума (Forum rules in Russian)
rm -rf /mnt/windows
rm -rf /mnt/windows
-
- beginner
- Сообщения: 35
- Зарегистрирован: 29 сен 2010, 14:00
- Версия LabVIEW: 2013
- Контактная информация:
Re: Checksum, CRC8 и CRC16
Вот я наваял расчётную программу.
На входе массив байт. На выходе тоже с уже добавленным CRC.
Если подать на вход массив вместе с CRC, то при верно принятом пакете загорится CRC OK. Это свойство CRC - "самоуничтожение" при расчёте CRC пакета вместе с самим CRC (ухх, сказанул).
На входе массив байт. На выходе тоже с уже добавленным CRC.
Если подать на вход массив вместе с CRC, то при верно принятом пакете загорится CRC OK. Это свойство CRC - "самоуничтожение" при расчёте CRC пакета вместе с самим CRC (ухх, сказанул).
- Вложения
-
- CRC16_TSKS_Full(SubVI).vi
- вычисление CRC16 для TSK
- (11.56 КБ) 382 скачивания
-
FireFly
- expert
- Сообщения: 1321
- Зарегистрирован: 25 апр 2009, 08:58
- Награды: 2
- Версия LabVIEW: 2014
- Откуда: Санкт-Петербург
- Поблагодарили: 1 раз
Re: Checksum, CRC8 и CRC16
Вчера начал работать с новыми изделиями нашей конторы, и как следствие с новым протоколом. В качестве контрольной суммы там используется CRC8 (раньше MD5 был).
Пользоваться сразу готовыми решениями не хотел, решил разобраться как этот CRC считается. Потратил кучу времени, но в основном всё понял. Написал свой алгоритм прям как в книжке. Побитовый. Всё работает, всё клёво :) Стал смотреть чужие алгоримы, и не могу понять как работает алгоритм orinoko. В том что он работает не сомневаюсь - результат совпадает.
Полином у нас используется X^8 + X^5 + X^4 + 1. Значение CRC перед вычислением инициализируется числом DE. Алгоритм и полином зеркальные (Т.е. использую функцию Rotate Right With Carry и байт полинома перевернул).
Выкладываю три решения:
1) Моё. Берется первый байт, инициализируется числом DE. Из остального массива первый байт удаляется, а в конец дописывается нулевой байт (число нулей, по весу полинома). Запускаем цикл, который будет крутиться пока не кончатся байты. В цикле к нашему регистру по ходу сдвига постоянно добавляются биты из следующего байта. Смотрим выдвигаемый бит, если 1, то осуществляем XOR с полиномом.
2) Алгоритм orinoko, переделанный под мою задачу. Не могу понять как это работает... По сути каждый байт мы дописываем 8 нулями. Затем проходим по нему полиномом и считаем остаток как обычно. Затем беря следующий байт мы делаем XOR с остатком от предыдущего байта, и повторяем процедуру...
Считал на бумажке - действительно работает, а почему не пойму....
Допустим есть наши данные - два байта (10101100), (01000111) и инициализации нет
Стандартный алгоритм их слепит в одну строчку и дополнит нулями 101011000100011100000000, пройдет по этой строчке полиномом, посчитав остаток. Получим CRC.
Алгоритм orinoko возмет первый байт, дополнит 8 нулями 1010110000000000, пройдя полиномом посчитает остаток.
Возмет второй байт, сделает XOR с остатком с предыдущего шага. Полученный результат дополнит 8 нулями, пройдет полиномом, посчитает остаток и почему-то тоже получит CRC
3) Ну третий вариант - просто табличный. Взял кажется с ni.com. Работает быстро и проще всего.
Пользоваться сразу готовыми решениями не хотел, решил разобраться как этот CRC считается. Потратил кучу времени, но в основном всё понял. Написал свой алгоритм прям как в книжке. Побитовый. Всё работает, всё клёво :) Стал смотреть чужие алгоримы, и не могу понять как работает алгоритм orinoko. В том что он работает не сомневаюсь - результат совпадает.
Полином у нас используется X^8 + X^5 + X^4 + 1. Значение CRC перед вычислением инициализируется числом DE. Алгоритм и полином зеркальные (Т.е. использую функцию Rotate Right With Carry и байт полинома перевернул).
Выкладываю три решения:
1) Моё. Берется первый байт, инициализируется числом DE. Из остального массива первый байт удаляется, а в конец дописывается нулевой байт (число нулей, по весу полинома). Запускаем цикл, который будет крутиться пока не кончатся байты. В цикле к нашему регистру по ходу сдвига постоянно добавляются биты из следующего байта. Смотрим выдвигаемый бит, если 1, то осуществляем XOR с полиномом.
2) Алгоритм orinoko, переделанный под мою задачу. Не могу понять как это работает... По сути каждый байт мы дописываем 8 нулями. Затем проходим по нему полиномом и считаем остаток как обычно. Затем беря следующий байт мы делаем XOR с остатком от предыдущего байта, и повторяем процедуру...
Считал на бумажке - действительно работает, а почему не пойму....
Допустим есть наши данные - два байта (10101100), (01000111) и инициализации нет
Стандартный алгоритм их слепит в одну строчку и дополнит нулями 101011000100011100000000, пройдет по этой строчке полиномом, посчитав остаток. Получим CRC.
Алгоритм orinoko возмет первый байт, дополнит 8 нулями 1010110000000000, пройдя полиномом посчитает остаток.
Возмет второй байт, сделает XOR с остатком с предыдущего шага. Полученный результат дополнит 8 нулями, пройдет полиномом, посчитает остаток и почему-то тоже получит CRC
3) Ну третий вариант - просто табличный. Взял кажется с ni.com. Работает быстро и проще всего.
- Вложения
-
- CRC v1.vi
- (16.25 КБ) 371 скачивание
-
- CRC v2.vi
- (14.99 КБ) 351 скачивание
-
- CRC v3 (Table).vi
- (14.78 КБ) 400 скачиваний
Иногда лучше молчать и слыть идиотом, чем заговорить и развеять все сомнения.
- Polarstern
- beginner
- Сообщения: 13
- Зарегистрирован: 17 июл 2012, 21:02
- Версия LabVIEW: 2011 sp1
- Откуда: Winnipeg, Canada
- Контактная информация:
Re: Checksum, CRC8 и CRC16
Добрый день коллеги,
У меня такая проблемма. Пытаюсь заставить LabView говорить по последовательному порту со следующим девайсом - позиционером Kipp & Zonen AP2 (Solar Tracker). Руководство пользователя здесь: http://www.campbellsci.ca/Catalogue/2AP_Man.pdf Удалось установить связь по последовательному порту, но существует следующая проблема: к стандартным командам надо добавлять печатные знаки, чтобы Checksum равнялась нулю.
В руководстве пользователя написано следующее:
У меня такая проблемма. Пытаюсь заставить LabView говорить по последовательному порту со следующим девайсом - позиционером Kipp & Zonen AP2 (Solar Tracker). Руководство пользователя здесь: http://www.campbellsci.ca/Catalogue/2AP_Man.pdf Удалось установить связь по последовательному порту, но существует следующая проблема: к стандартным командам надо добавлять печатные знаки, чтобы Checksum равнялась нулю.
В руководстве пользователя написано следующее:
Может быть кому-то приходилось писать нечто подобное - генератор добавочных символов, чтобы Checksum равнялось нулю?The 2AP and the controller communicate in ASCII message strings. The controller initiates all
communication. All commands from the controller start with a command identifier. Only the first two
letters of the command identifier are necessary, but the entire identifier may be sent if desired. The
command identifier may be separated from any parameters by one or more blanks (ASCII 32).
Parameters are separated from one another by one or more blanks.
The 2AP provides framing with forward error detection (FED). A message starts with a twocharacter
command identifier and ends with a carriage return (ASCII code 13). Linefeed characters
may be inserted before or after the carriage return; they are discarded. Messages sent by the 2AP
always terminate in a linefeed and a carriage return (ASCII codes 10 and 13 in that order).
As a result of FED framing being used, each message has an additional parameter. This parameter
is a sequence of letters chosen to ensure that the 8-bit sum of all the characters in the message
(excluding linefeeds and the carriage return) is 0. Messages sent by the 2AP always terminate in a
sequence of (possibly no) carets (ASCII 94) followed by the necessary character to derive the
desired sum. The algorithm used to generate this checksum is presented in section 6.4.
Many commands are followed by a one-digit integer specifying which motor the command affects.
The integer 0 means the azimuth motor, 1 means the zenith motor and 2 means the auxiliary motor
(if present in the instrument). Most commands may be followed by numeric parameters. Numeric
parameters are always floating point, with optional decimal places and exponents.
....
6.4 GENERATING THE FED CHECK SEQUENCE
On receipt of a message, one simply adds up the binary representations of all printable characters.
That sum must be zero (modulo 256). Generating a check sequence of printable characters is not
quite that simple. The following C code shows one way of accomplishing the task:
checkSum = 0;
end = 0;
while (command[end]) // calculate sum so far
checkSum += command[end++];
checkSum += command[end++] = ' '; // separate check bytes
while (checkSum <130 || checkSum> 223) // make all printable
checkSum += command[end++] = '^';
- Polarstern
- beginner
- Сообщения: 13
- Зарегистрирован: 17 июл 2012, 21:02
- Версия LabVIEW: 2011 sp1
- Откуда: Winnipeg, Canada
- Контактная информация:
Re: Checksum, CRC8 и CRC16
Вот наваял следующую подпрограмму, пытался отфильтровать чтобы символы были из печатного диапазона. Полезным оказалась следующая информация:
On-line CRC calculation and free library
ASCII character map
Было бы интересно услышать мнение коллег как еще ее можно оптимизировать?
On-line CRC calculation and free library
ASCII character map
Было бы интересно услышать мнение коллег как еще ее можно оптимизировать?
-
- VIP
- Сообщения: 1337
- Зарегистрирован: 03 фев 2010, 00:42
- Награды: 6
- Версия LabVIEW: 6.1 - 2024
- Откуда: Германия
- Благодарил (а): 1 раз
- Поблагодарили: 44 раза
- Контактная информация:
Re: Checksum, CRC8 и CRC16
Ну разве что так:Polarstern писал(а):Было бы интересно услышать мнение коллег как еще ее можно оптимизировать?
А в остальном нормально там всё, если работает. Не заморачивайтесь.
-
- interested
- Сообщения: 5
- Зарегистрирован: 09 янв 2015, 18:28
- Версия LabVIEW: 2014
- Контактная информация:
Re: Checksum, CRC8 и CRC16
Здравствуйте нужен прибор для проверки CRC-16 с лампочкой ) , прибор orinoko выдаёт СRC отличный от того, что идет с библиотекой MB помогите собрать а то не соберу.
- Вложения
-
- MB CRC-16.vi
- (10.62 КБ) 188 скачиваний
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 88 раз
Re: Checksum, CRC8 и CRC16
Нужно знать алгоритм вычисления CRC, т.к. используются различные порождающие полиномы:Pianist писал(а):Здравствуйте нужен прибор для проверки CRC-16 с лампочкой ) , прибор orinoko выдаёт СRC отличный от того, что идет с библиотекой MB помогите собрать а то не соберу.
https://ru.wikipedia.org/wiki/%D0%A6%D0 ... 0%BE%D0%B4
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
- interested
- Сообщения: 5
- Зарегистрирован: 09 янв 2015, 18:28
- Версия LabVIEW: 2014
- Контактная информация:
Re: Checksum, CRC8 и CRC16
Спасибо но я вышел из ситуации
- Вложения
-
- CRC-16 Control.llb
- (16.68 КБ) 226 скачиваний