Checksum, CRC8 и CRC16

VISA, TCP/IP, USB, CAN, GPIB и подобные протоколы
Аватара пользователя
Viktor

Activity Professionalism Tutorials Black
expert
expert
Сообщения: 1408
Зарегистрирован: 23 мар 2008, 10:56
Награды: 4
Версия LabVIEW: 2020
Откуда: Санкт-Петербург
Благодарил (а): 17 раз
Поблагодарили: 3 раза
Контактная информация:

Re: Checksum, CRC8 и CRC16

Сообщение Viktor »

На всякий случай приложу описание этого девайса - там есть протокол обмена и алгоритм вычисления CRC.
Я следовал указаниям из этого документа, но получал совершенно не те значения CRC , которые там приведены в примере :crazy:
Т. е. у меня всё работает, стоит подставить значения CRC из примера, но как его получить для другого сетевого адреса :dntknw:
Или в описании алгоритма ошибка(опечатка), или я зациклился и чего-то в упор не вижу :help:
TSK.pdf
(407.48 КБ) 382 скачивания
Аватара пользователя
Viktor

Activity Professionalism Tutorials Black
expert
expert
Сообщения: 1408
Зарегистрирован: 23 мар 2008, 10:56
Награды: 4
Версия LabVIEW: 2020
Откуда: Санкт-Петербург
Благодарил (а): 17 раз
Поблагодарили: 3 раза
Контактная информация:

Re: Checksum, CRC8 и CRC16

Сообщение Viktor »

Неужели никто не поможет перевести СИ код в :labview: ?
http://www.labviewportal.org/viewtopic. ... =15#p25268
:cry:
Там всего несколько строк :wink:
Аватара пользователя
mzu2006

Professionalism Tutorials Black
doctor
doctor
Сообщения: 2456
Зарегистрирован: 16 авг 2008, 02:12
Награды: 3
Версия LabVIEW: 7.1 10 11 12
Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
Контактная информация:

Re: Checksum, CRC8 и CRC16

Сообщение mzu2006 »

В упор не понимаю зачем они сделали класс, занимающийся вычислением CRC. Я перенёс этот класс 1-в-1 на LabVIEW. Код подлежит серьёзной оптимизации
Вложения
ViktorCRC.zip
(49.29 КБ) 342 скачивания
orinoko
beginner
beginner
Сообщения: 35
Зарегистрирован: 29 сен 2010, 14:00
Версия LabVIEW: 2013
Контактная информация:

Re: Checksum, CRC8 и CRC16

Сообщение orinoko »

Вот я наваял расчётную программу.
На входе массив байт. На выходе тоже с уже добавленным CRC.
Если подать на вход массив вместе с CRC, то при верно принятом пакете загорится CRC OK. Это свойство CRC - "самоуничтожение" при расчёте CRC пакета вместе с самим CRC (ухх, сказанул).
Вложения
CRC16_TSKS_Full(SubVI).vi
вычисление CRC16 для TSK
(11.56 КБ) 379 скачиваний
в виде картинки
в виде картинки
Аватара пользователя
Viktor

Activity Professionalism Tutorials Black
expert
expert
Сообщения: 1408
Зарегистрирован: 23 мар 2008, 10:56
Награды: 4
Версия LabVIEW: 2020
Откуда: Санкт-Петербург
Благодарил (а): 17 раз
Поблагодарили: 3 раза
Контактная информация:

Re: Checksum, CRC8 и CRC16

Сообщение Viktor »

mzu2006, orinoko, спасибо огромное за помощь!!!
:thank:
Аватара пользователя
FireFly

Activity Black
expert
expert
Сообщения: 1321
Зарегистрирован: 25 апр 2009, 08:58
Награды: 2
Версия LabVIEW: 2014
Откуда: Санкт-Петербург
Поблагодарили: 1 раз

Re: Checksum, CRC8 и CRC16

Сообщение FireFly »

Вчера начал работать с новыми изделиями нашей конторы, и как следствие с новым протоколом. В качестве контрольной суммы там используется 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 :suicide:

3) Ну третий вариант - просто табличный. Взял кажется с ni.com. Работает быстро и проще всего.
Вложения
CRC v1.vi
(16.25 КБ) 369 скачиваний
CRC v2.vi
(14.99 КБ) 348 скачиваний
CRC v3 (Table).vi
(14.78 КБ) 397 скачиваний
Иногда лучше молчать и слыть идиотом, чем заговорить и развеять все сомнения.
Аватара пользователя
Polarstern
beginner
beginner
Сообщения: 13
Зарегистрирован: 17 июл 2012, 21:02
Версия LabVIEW: 2011 sp1
Откуда: Winnipeg, Canada
Контактная информация:

Re: Checksum, CRC8 и CRC16

Сообщение Polarstern »

Добрый день коллеги,

У меня такая проблемма. Пытаюсь заставить LabView говорить по последовательному порту со следующим девайсом - позиционером Kipp & Zonen AP2 (Solar Tracker). Руководство пользователя здесь: http://www.campbellsci.ca/Catalogue/2AP_Man.pdf Удалось установить связь по последовательному порту, но существует следующая проблема: к стандартным командам надо добавлять печатные знаки, чтобы 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++] = '^';
Может быть кому-то приходилось писать нечто подобное - генератор добавочных символов, чтобы Checksum равнялось нулю?
Аватара пользователя
Polarstern
beginner
beginner
Сообщения: 13
Зарегистрирован: 17 июл 2012, 21:02
Версия LabVIEW: 2011 sp1
Откуда: Winnipeg, Canada
Контактная информация:

Re: Checksum, CRC8 и CRC16

Сообщение Polarstern »

Вот наваял следующую подпрограмму, пытался отфильтровать чтобы символы были из печатного диапазона. Полезным оказалась следующая информация:

On-line CRC calculation and free library

ASCII character map

Было бы интересно услышать мнение коллег как еще ее можно оптимизировать?
AP2ChecksumString.jpg
AP2ChecksumString.vi
(17.07 КБ) 253 скачивания
AndreyDmitriev

Activity Professionalism Tutorials Gold Black
VIP
VIP
Сообщения: 1327
Зарегистрирован: 03 фев 2010, 00:42
Награды: 6
Версия LabVIEW: 6.1 - 2024
Откуда: Германия
Благодарил (а): 1 раз
Поблагодарили: 38 раз
Контактная информация:

Re: Checksum, CRC8 и CRC16

Сообщение AndreyDmitriev »

Polarstern писал(а):Было бы интересно услышать мнение коллег как еще ее можно оптимизировать?
Ну разве что так:
08-08-2012 23-36-26.png
08-08-2012 23-36-26.png (3.38 КБ) 12847 просмотров
А в остальном нормально там всё, если работает. Не заморачивайтесь.
Pianist
interested
interested
Сообщения: 5
Зарегистрирован: 09 янв 2015, 18:28
Версия LabVIEW: 2014
Контактная информация:

Re: Checksum, CRC8 и CRC16

Сообщение Pianist »

Здравствуйте нужен прибор для проверки CRC-16 с лампочкой ) , прибор orinoko выдаёт СRC отличный от того, что идет с библиотекой MB :labview: помогите собрать а то не соберу.
Вложения
CRC FORUM.jpg
CRC16Forum.jpg
MB CRC-16.vi
(10.62 КБ) 185 скачиваний
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5462
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 86 раз

Re: Checksum, CRC8 и CRC16

Сообщение IvanLis »

Pianist писал(а):Здравствуйте нужен прибор для проверки CRC-16 с лампочкой ) , прибор orinoko выдаёт СRC отличный от того, что идет с библиотекой MB :labview: помогите собрать а то не соберу.
Нужно знать алгоритм вычисления CRC, т.к. используются различные порождающие полиномы:
https://ru.wikipedia.org/wiki/%D0%A6%D0 ... 0%BE%D0%B4
Pianist
interested
interested
Сообщения: 5
Зарегистрирован: 09 янв 2015, 18:28
Версия LabVIEW: 2014
Контактная информация:

Re: Checksum, CRC8 и CRC16

Сообщение Pianist »

Спасибо но я вышел из ситуации
Вложения
CRC-16 Control.llb
(16.68 КБ) 223 скачивания
CRC16Forum.jpg
Ответить

Вернуться в «Коммуникация с приборами»