82

Помогите разобрать протокол

Возникла необходимость прочитать и имитировать данные, посылаемые датчиком в ЭБУ. Датчик измеряет 4 параметра и шлёт их по шине LIN с нестандартной скоростью в ЭБУ. ЭБУ, в свою очередь, отображает полученные данные в ПО на компе.

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

Помогите разобрать протокол Электроника, Нужна помощь в ремонте, Arduino

Выяснил, скорость 8000 бод. Считал поток в терминал, вычленил ID отключая разные исполнительные девайсы, висящие на шине. Нашёл нужный мне ID, который давал данные при подключенном датчике, и не давал при отключенном.

Далее написал прошивку, которая отвечает на запрос ЭБУ вместо датчика. В ПО присутствие эмулятора видно (начинают появляться данные), корректность получаемых данных тоже подтверждена. Формат пакета стандартный LIN: синхра(0х55), ID (в моём случае 47), 4 байта данных, контрольная сумма один байт. Если просчитатся с контролькой и отправить некорректную, то датчик в ПО отваливается. Отсюда-данные передаются и воспринимаются ЭБУ и ПО корректно.

И вот тут затык. Из 4 байтов данных два средних байта не влияют на данные, отображаемые ПО. А малейшее изменение первого и последнего меняют три параметра, отображаемые ПО, один параметр постоянно болтается в ноле. На него 1 и 4 байт не влияют.

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

Провёл несколько экспериментов, полученные данные свёл в таблицу. Жёлтый столбик данные датчика, зелёный отображаемые в ПО.

Помогите разобрать протокол Электроника, Нужна помощь в ремонте, Arduino

TECHNO BROTHER

2K пост13.5K подписчика

Правила сообщества

1-Мы А-политическое сообщество. 2-Запрещено оскорбление: Администрации Пикабу, сообщества, участников сообщества а также родных, близких выше указанных.

3-Категорически запрещается разжигание межнациональной розни или действий, направленных на возбуждение национальной, расовой вражды, унижение национального достоинства, а также высказывания о превосходстве либо неполноценности пользователей по признаку их отношения к национальной принадлежности или политических взглядов. Мат - Нежелателен. Учитесь выражать мысли без матерщины

Вы смотрите срез комментариев. Показать все
1
Автор поста оценил этот комментарий
Может, уже ответили: "Как такое может быть? Как четырьмя тетрадами можно закодировать минимум три трёхзначных параметра, два с дробной частью до десятых и два до сотых?"
Смотря какой диапазон значений. Приведу лёгкий пример: как двумя байтами закодировать дробные числа с точностью до сотых.
1. Дробное число умножаем на 100
2. Округляем
3. Прибавляем 32000, получаем 16-битный ответ, который и передаём.
Алгоритм будет работать в диапазоне от -320.00 до +320.00 (чуть побольше, не суть).
Чтобы восстановить начальное значение - выполняем шаги в обратной последовательности:
1. Вычесть 32000
2. Поделить на 100.
раскрыть ветку (3)
1
Автор поста оценил этот комментарий
Кому как удобно, можно не прибавлять 32000, тогда тип передаваемых данных будет не uint16, а int16. Просто в случае чего потом лишний гемор колупаться с отрицательными числами на осциллограмме
0
Автор поста оценил этот комментарий
Передайте вашим методом 4 числа 100.1, -200.2, 2.02, 3.33? При этом впишите их в 4 восьмибитных числа, два из которых 00 и 00. В вашем распоряжении только два uint8
раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Сорян
Предпросмотр
Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку