На уровне шины CAN не существует понятий «скорость», «оборот двигателя» или «уровень топлива». Шина передает только сообщения фиксированной структуры, внутри которых находится набор сырых байтов.
Каждое сообщение — это компактный контейнер данных. Его задача — доставить набор значений от одного электронного блока к другим. Смысл этих значений не задан самой шиной и не может быть определен без дополнительного описания.
Таким образом, при работе с CAN всегда действует одна и та же модель:
есть сообщение → внутри 8 байт → необходимо извлечь из них осмысленные параметры.
Каждое сообщение CAN можно рассматривать как структуру из трех ключевых элементов:

Идентификатор (ID) определяет тип сообщения. Это не адрес получателя, а признак того, какие именно данные передаются.
Существует два формата идентификатора:
Разница между ними заключается в диапазоне возможных значений. Расширенный формат используется в системах с большим количеством сообщений, где требуется больше уникальных идентификаторов.
В расширенном формате CAN (29-битный ID) идентификатор может иметь внутреннюю структуру, определяемую протоколом.
Например, в протоколе SAE J1939 эти 29 бит разделены на поля (приоритет, PGN, адрес источника и др.), каждое из которых имеет фиксированное назначение.
PGN — это часть ID, которая определяет:
Фактически:
Один PGN соответствует одному набору параметров, меняются только значения.
На практике фильтрация часто выполняется по PGN, а не по полному ID.
| Биты | 28..26 | 25 | 24 | 23..16 | 15..8 | 7..0 |
|---|---|---|---|---|---|---|
| Поля | Prio | R | DP | PF | PS | SA |
PGN = 18 бит:
Не входят:
Поле DLC (Data Length Code) указывает длину полезной нагрузки. В классическом CAN это значение от 0 до 8 байт. В большинстве случаев используется максимальная длина — 8 байт.
Поле DATA содержит сами данные. Это массив из 8 байт, каждый из которых представляет собой число от 0 до 255. Именно здесь находятся все параметры, но в неинтерпретированном виде.
Важно понимать: структура кадра одинакова для всех автомобилей, но смысл содержимого DATA полностью определяется протоколом, используемым конкретным производителем.
Ключевая особенность CAN заключается в том, что он не передает готовые значения параметров. Он передает только последовательность байтов.
Например, сообщение может выглядеть так:
ID: 0x123
DLC: 8
DATA: 0A 1F 00 64 FF 10 03 7C
На этом уровне невозможно определить, что означают эти числа. Они не имеют физического смысла сами по себе. Только при наличии описания протокола можно понять, какие байты относятся к какому параметру и как их интерпретировать.
Это означает, что один и тот же набор байтов в разных автомобилях может означать разные величины.
Когда значение занимает более одного байта, возникает вопрос: в каком порядке эти байты следует интерпретировать.
Существует два основных варианта:
Little Endian — младший байт идет первым.
Big Endian — старший байт идет первым.

Таким образом, один и тот же набор байтов может давать разные численные значения в зависимости от порядка их интерпретации.
На практике это один из ключевых источников ошибок при декодировании. Без знания порядка байтов корректно восстановить значение невозможно.
Поле DATA представляет собой непрерывный массив байтов, внутри которого могут быть закодированы различные типы данных. При этом границы параметров не совпадают с границами байтов и задаются протоколом.
Один байт может использоваться как:
Целые значения могут занимать один или несколько байтов. При этом важно учитывать порядок байтов и разрядность.
Ключевой момент: один и тот же байт может одновременно участвовать в нескольких параметрах, если параметры используют разные биты этого байта.
Процесс извлечения значения из DATA состоит из последовательных шагов.
Сначала определяется, какие байты относятся к параметру. Затем учитывается порядок байтов. После этого байты объединяются в число. На последнем этапе применяется масштабирование.
Рассмотрим простой пример.
Пусть значение занимает два байта:
DATA: ... 0x0A 0x1F ...
Предположим, что используется Big Endian. Тогда:
0x0A 0x1F → 0x0A1F → 2591
Если задан коэффициент масштабирования 0.1, итоговое значение будет:
2591 × 0.1 = 259.1
На данном этапе важно понять сам принцип: байты не являются готовым значением. Это код, который необходимо преобразовать.
Подробно масштабирование и формирование параметров рассматриваются в следующем модуле.
Без описания протокола (DBC, CAF или аналогичного файла) данные CAN не имеют практического смысла. Невозможно определить:
Даже если наблюдается изменение байтов при изменении состояния автомобиля, это не гарантирует корректную интерпретацию параметра.
Практическая работа с CAN всегда опирается на гипотезы, которые затем подтверждаются через анализ логов и сопоставление с реальными событиями.
На 3-й секунде лога в байте D1 происходит переполнение, и в этот момент значение байта D0 увеличивается на единицу. Это свидетельствует о том, что эти два байта образуют одно число: D0 — старший байт, а D1 — младший.

Попробуйте самостоятельно найти такую закономерность в сообщениях с другим ID.
Задача не в том, чтобы точно определить параметр, а в том, чтобы научиться видеть структуру данных и повторяемость.
CAN-сообщение — это контейнер до 8 байт без фиксированного смысла. Интерпретация задаётся протоколом.
Для декодирования нужно определить:
Преобразование байтов в параметр рассматривается в следующих модулях руководства.