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

Да, вполне возможно. От меня чёго хош можно ожидать.( sav13, ты уж извиняй за наезды.

Ну вот получилось найти решение практически по методу Дмитрия Ивановича )))
Вечером повозился с задачкой, а утром на свежую голову получилось решение:

Однобайтовая сумма данных без заголовка равна 356 - сумма (ну или логическому или) двух байт контрольной суммы.

Теперь терзает другая загадка (которую разгадать горазда сложнее) - зачем?
Зачем удлинять CRC на один байт плодя много незначащих битов?
Странные эти люди, китайцы

Всем спасибо за накинутые подсказки. Помогло.

Не обижайся, если где то обидел. Каюсь, бывает сарказма могу добавить в обсуждениях.

Слушай, но обзоры у тебя классные, этого не отнять. Особенно по потреблению и батареям питания. Но, хочу сказать что лучше CR2032 батареек нету.) И по ёмкости, и по габаритам. Я одно время (несколько лет) эксплуатировал Polar CS600, а там CR2354 - и дорогая, и редкая. Но, если подложить копейку, то 2032 вполне справляется. Ну, может только чаще менять приходилось. Но доступность и стоимость не сравнить.)

Посмотрите код новичков (и не только), который тут выкладывается. Думаете там лучше?

Ну это все таки коммерческое решение с претензией на мировой рынок. И чего там Modbus RTU не применить бы было? У них бы эти датчики отдельно бы брали, а не с их дурацкими контроллерами, которые на верхний уровень по CAN работают.

CR2450 еще более менее. Но все эти литиевые батареи в несвежем состоянии очень просаживают напряжение под мало-мальской нагрузкой. А на отправку все датчики по нескольку десятков мА шлют.
Попробовал LiSOCL2 на 3.6В - там токи поболее и напряжение изначально 3.6В - самое то на всякие STM32/ESP32 без всяких LDO
Ео очень уж дорогие, редкие и капризные они. Дешевле получилось аккумуляторы LiFePo4 в AAA размере брать. И отсекать питание ниже 2.7В
Сейчас два датчика на улице работают - ионистор + солнечная панелька. Тоже прикольно

1 лайк

От больших токов (кратковременных), я так понимаю, конденсаторы спасают… Вопрос только в длительности этих просадок. Вот такие внутренности у фирменного устройства. Как бы не на год хватало 2354.

Не похоже это на CRC. Уж больно рядом значения ложатся. А первый байт, который 8x - это точно отношения к контрольной сумме не имеет.

Это счетчик пакетов какой-то. А может там timestamp передается.

Я бы попробовал попосылатиь пакетики, такие, как выдает эталонный контроллер, но поиграться с этими двумя байтами - попробовать их поменять на что-то и посмотреть, что получится.

Декомпрессиметр на фотке? Датчик давления симпатишненький стоит.

Да, давление измерял нормально. Высоту строил на графиках. Калибровать только нужно было изредка.(

Всего лишь велокомп.)

Насчет CRC я не уверен, но закономерность примерно такая. правда на PHP (так быстрее было), но думаю сойдет

$flag =((0x45 - $addr1 * 2) % 16) & 0x08;
$MSB = 0x80 + $flag;
$LSB = (0x55 - 6 * ($flag >> 3)) - 2 * ($addr1 + ($flag >> 3));

Может быть поможет?

Да тут все проще оказалось:
Декодирование:

uint8_t CRC = 256 - (MSB+LSB);

Ну и соответственно кодирование:

uint8_t LSB = (256-CRC)&0x77;
uint8_t MSB = 256-CRC-LSB;