Помогите расковырять алгоритм CRC

Всем привет
Попали ко мне ультразвуковые датчики расстояния AKE PUD-11R


Датчики имеют интерфейс RS485 со своим собственным протоколом

Никто не встречал такой странный алгоритм CRC ?
Уже все калькуляторы перепробовал и мозг сломал себе

Например команда опроса датчиков с разными адресами:

0xDB 0x00 0x00 0x70 0xBB 0x80 0x55 0xDD  
0xDB 0x01 0x01 0x70 0xBB 0x80 0x53 0xDD
0xDB 0x03 0x03 0x70 0xBB 0x88 0x47 0xDD  
0xDB 0x04 0x04 0x70 0xBB 0x88 0x45 0xDD 
0xDB 0x05 0x05 0x70 0xBB 0x88 0x43 0xDD 
0xDB 0x06 0x06 0x70 0xBB 0x88 0x41 0xDD 
0xDB 0x07 0x07 0x70 0xBB 0x80 0x47 0xDD 
0xDB 0x08 0x08 0x70 0xBB 0x80 0x45 0xDD 
0xDB 0x09 0x09 0x70 0xBB 0x80 0x43 0xDD 
0xDB 0x0A 0x0A 0x70 0xBB 0x80 0x41 0xDD 
0xDB 0x0B 0x0B 0x70 0xBB 0x88 0x37 0xDD 
0xDB 0x0C 0x0C 0x70 0xBB 0x88 0x35 0xDD 
0xDB 0x0D 0x0D 0x70 0xBB 0x88 0x33 0xDD 
0xDB 0x0E 0x0E 0x70 0xBB 0x88 0x31 0xDD 
0xDB 0x0F 0x0F 0x70 0xBB 0x80 0x37 0xDD 
0xDB 0x10 0x10 0x70 0xBB 0x80 0x35 0xDD 
0xDB 0x11 0x11 0x70 0xBB 0x80 0x33 0xDD 
0xDB 0x12 0x12 0x70 0xBB 0x80 0x31 0xDD 
0xDB 0x13 0x13 0x70 0xBB 0x88 0x27 0xDD 
0xDB 0x14 0x14 0x70 0xBB 0x88 0x25 0xDD 
0xDB 0x15 0x15 0x70 0xBB 0x88 0x23 0xDD 
0xDB 0x16 0x16 0x70 0xBB 0x88 0x21 0xDD 
0xDB 0x17 0x17 0x70 0xBB 0x80 0x27 0xDD 
0xDB 0x18 0x18 0x70 0xBB 0x80 0x25 0xDD 
0xDB 0x19 0x19 0x70 0xBB 0x80 0x23 0xDD 
0xDB 0x1A 0x1A 0x70 0xBB 0x80 0x21 0xDD 
0xDB 0x1B 0x1B 0x70 0xBB 0x88 0x17 0xDD 
0xDB 0x1C 0x1C 0x70 0xBB 0x88 0x15 0xDD 
0xDB 0x1D 0x1D 0x70 0xBB 0x88 0x13 0xDD 
0xDB 0x1E 0x1E 0x70 0xBB 0x88 0x11 0xDD 
0xDB 0x1F 0x1F 0x70 0xBB 0x80 0x17 0xDD

Ответ датчика:

0xEA 0x55 0x1B 0x10 0x09 0x00 0x03 0x00 0x74 0xDD

Похоже что CRC это два байта перед завершающим символом 0xDD
Но первый байт принимает значение 0x00, 0x80 и 0x88 (может быть еще 0x08 но не встречал)
Второй уменьшается по мере увеличения суммы байт команды
Самое большое значение 0x77, потом идет 0x00

Уверенны, что выбрали правильную скорость передачи данных? Прежде чем ломать протокол, надо убедиться, в стабильности принимаемых/отправляемых байт при одинаковых условиях работы устройств. А CRC - это всегда 2 последних байта, и алгоритмы их вычисления известны из таблиц (это не секрет какой то) . Если идёт плавание данных, то скорость выбрана неправильно. А вообще, датчику этот CRC нафик не упёрся. Вряд ли он там вообще есть.

Байты хвоста: в первом используются только два старших бита в каждом полубайте. Во втором по три младших. Из приведенных примеров достаточно было бы одного финального байта, если там не заложено на большее. Иначе какая-то систематическая ошибка. Согласен с версией про скорость.
Вы выделили структуру пакетов? Где адреса, где данные?

Первый байт - заголовок 0xDB
Затем два байта дублируется (зачем то?) адрес
Потом команда с аргументами (встречал 2 и 4 байта)
Потом эти самые полубайты CRC
И замыкающий 0xDD

В ответе первый байт 0xEA
Потом непонятно
Последние три байта аналогичны команде

Скорость и параметры UART подбирал разные
Везде кроме 9600 8N1 датчик просто е отвечает
Есть ответ га 9600 8O1 и 9600 8E1 но там структура пакета разваливается (завершающий постоянно разный
Ну и в ответе я четко нашел байт растояние

Какую сторону вам надо эмулировать? Контроллер или датчик? Если время поджимает, а память есть, для запросов можно и таблицу составить.
Обратите внимание на закономерность адреса и первого байта хвоста.

sav13, чем то ты мне не понравился… А вот чем - не помню. Так что ответа нормального не жди.

А озвучивать это зачем?

А что бы знал.

Переживу. Не пряник, чтобы всем нравится
А вот на брудершафт мы вроде не пили?

Датчики у меня есть. Мне нужно сделать прошивку контроллера, чтобы датчик понимал мои команды

Ой, да ладно. Интернет же.
Но я хотел бы услышать другое мнение.

В запросах в последнем байте уж очень стабильная повторяющаяся цикличность, как бы не счетчик оказался. Как минимум, хорошо бьется с адресом.
7 5 3 1 с 0 и 7 5 3 1 с 8. И так периодически. Сторону запроса таблично подобрать не сложно.
Команда запроса только 0х70?
Кажется что первая цифра из 0х88 (8 пока что) дополняет команду, вторая из 0х88 (0 или 8) дополняет адрес.

Команды видел только 0x70
Но 0x88 не с адресом бьет
Вот установка пределов измерения для сенсора 0x01 с эталонного контроллера

0xDB 0x01 0x01 0x70 0xAA 0x00 0x80 0x64 0xDD 
0xDB 0x01 0x01 0x70 0xAA 0x01 0x80 0x63 0xDD 
0xDB 0x01 0x01 0x70 0xAA 0x02 0x80 0x62 0xDD 
0xDB 0x01 0x01 0x70 0xAA 0x03 0x80 0x61 0xDD 
0xDB 0x01 0x01 0x70 0xAA 0x04 0x80 0x60 0xDD 
0xDB 0x01 0x01 0x70 0xAA 0x05 0x88 0x57 0xDD 
0xDB 0x01 0x01 0x70 0xAA 0x06 0x88 0x56 0xDD 
0xDB 0x01 0x01 0x70 0xAA 0x07 0x88 0x55 0xDD 
0xDB 0x01 0x01 0x70 0xAA 0x08 0x88 0x54 0xDD 
0xDB 0x01 0x01 0x70 0xAA 0x09 0x88 0x53 0xDD 
0xDB 0x01 0x01 0x70 0xAA 0x0A 0x88 0x52 0xDD 
0xDB 0x01 0x01 0x70 0xAA 0x0B 0x88 0x51 0xDD 
0xDB 0x01 0x01 0x70 0xAA 0x0C 0x88 0x50 0xDD 
0xDB 0x01 0x01 0x70 0xAA 0x0D 0x80 0x57 0xDD 
0xDB 0x01 0x01 0x70 0xAA 0x0E 0x80 0x56 0xDD 
0xDB 0x01 0x01 0x70 0xAA 0x0F 0x80 0x55 0xDD 
0xDB 0x01 0x01 0x70 0xAA 0x10 0x80 0x54 0xDD 
0xDB 0x01 0x01 0x70 0xAA 0x11 0x80 0x53 0xDD 
0xDB 0x01 0x01 0x70 0xAA 0x12 0x80 0x52 0xDD 

А вот здесь переход старшего разряда

0xDB 0x1F 0x1F 0x70 0xAA 0x14 0x80 0x14 0xDD 
0xDB 0x1F 0x1F 0x70 0xAA 0x1E 0x88 0x02 0xDD 
0xDB 0x1F 0x1F 0x70 0xAA 0x1F 0x88 0x01 0xDD 
0xDB 0x1F 0x1F 0x70 0xAA 0x20 0x88 0x00 0xDD 
0xDB 0x1F 0x1F 0x70 0xAA 0x21 0x80 0x07 0xDD 
0xDB 0x1F 0x1F 0x70 0xAA 0x23 0x80 0x05 0xDD 
0xDB 0x1F 0x1F 0x70 0xAA 0x24 0x80 0x04 0xDD 
0xDB 0x1F 0x1F 0x70 0xAA 0x25 0x80 0x03 0xDD 
0xDB 0x1F 0x1F 0x70 0xAA 0x26 0x80 0x02 0xDD 
0xDB 0x1F 0x1F 0x70 0xAA 0x27 0x80 0x01 0xDD 
0xDB 0x1F 0x1F 0x70 0xAA 0x28 0x80 0x00 0xDD 
0xDB 0x1F 0x1F 0x70 0xAA 0x29 0x08 0x77 0xDD 
0xDB 0x1F 0x1F 0x70 0xAA 0x2F 0x08 0x71 0xDD 
0xDB 0x1F 0x1F 0x70 0xAA 0x30 0x08 0x70 0xDD 

Мля методики нет у вас, скорость 9600, в даташите сказано, подсоедините один а не зоопарк, шлите команду на чтение получайте ответ и увеличивайте расстояние до объекта.
Тогда хоть что то понять будет можно.

С ответом все более менее:
Вот два ответа датчика на два расстояния

0xEA 0x55 0x0F 0x10 0x08 0x00 0x00 0x80 0x04 0xDD 
0xEA 0x55 0x0F 0x04 0x09 0x00 0x00 0x88 0x07 0xDD 

Первый ответ:
3 байт - уставка 0x0F - 1.5м
4 байт - дистанция 0x10 - 1.6м
5 байт - сигнализация 0x08 - нет

Второй ответ:
3 байт - уставка 0x0F - 1.5м
4 байт - дистанция 0x04 - 0.4м
5 байт - сигнализация 0x09 - да

Проблема именно с CRC, чтобы формировать запросы из своего контроллера

Попробуйте напрячь ИИ. Именно что-то разгадать он полезен. Закономерности улавливать способен.

Еще одна проверка. Являются ли контрольные биты зависимыми друг от друга, или нет. Несколько исходных пакетов отличающихся только в одном разряде в каких-либо байтах (не обязательно только в одном). Влияет ли это на 1 бит контрольной суммы, или на всю? Пока что по виду предполагаю независимость. Банальный XOR ведь проверили? По всему пакету, по пакету без разметки, по пакету без разметки и повторений.

По всему-то смысла нет, если рассматривать стандартное строение фрейма. Хотя, зная китайцев, можно предположить, что они считают всё, кроме трёх байт из середины.

У меня другое мнение. Уверен, ты с кем-то перепутал уважаемого sav13