Все знают авто-электриков и диагностов. Я себя называю IT-автоэлектрик. Объединяю физику автомобильных цепей и низкоуровневого программирования на С.

CAN шина это мост между двумя мирами автоэлектриков и IT специалиста. Но для многих этот мост, увы кажется непреодолимой пропастью. Ребята попробуйте программировать на Си и вы пойдёте по этому мосту. Я начинал программировать в телефоне termux. То есть для этого нужно только желание.

Я себя не считаю самым умным. Я просто нашел для себя мощную точку пересечения этих профессий и стал называть этот подход IT-автоэлектрик. Писать свои собственные утилиты на С чтоб заглянуть под капот CAN шины. Под капотом ДВС менее интересно.

Разрабатываю две утилиты "карта" map_id_j1939.c и "микроскоп" viz_j1939.c . Программы написанны теперь нужно проверить в деле. Снимаю лог candump -t a > file на заведомо исправной машине. Настраиваю фильтр своего микроскопа FECA это активные ошибки.

./map_id_j1939
./map_id_j1939

Читаем слева на право от нуля. Byte0 - приоритет + 2 младших бита расширение. Byte1 - голова. Byte2 - хвост Byte3 - адресный. Читаем с лево на прово. Byte3 > [0] это ДВС смотрим поле данных чисто ошибок нет. Хотя по коробке 0xB не чисто . Но на панели ни один чек не светился. Не хочу обесценивать ни чей труд и бизнес. Не дорогой свисток + С + Linux = диагностика.

Что я сделаю теперь? Сниму разъём с датчика наддува.

./map_id_j1939
./map_id_j1939

Поле данных двигателя внутреннего сгорания можем видеть ошибку. Считаем с лево на право давайте от 1 хотя ЭВМ считает от 0. Итак 3,4 и 3 старших бита 5 байта это SPN 5 младших бита 5 байта FMI 6 байт счётчик.

./mask_shift
./mask_shift

Получается SPN 102 FMI 4 счётчик 1 . Есть подозрение, что утилита работает.

Размер моих логов на сегодняшний день 1 - 3 мегабайта. Если вес лога гигабайты то по идее данные нужно положить в голову страницы и процессор полетит как пуля. Размер скомпилированного файла map_id_j1939.c и viz_j1939.c по 16.5 КБ.

В следующей статье покажу одну аномалию которую я вытянул картой ./map_id_j1939 это моя вторая утилита.

Люблю создавать утилиты с нуля и сейчас глубоко изучаю протокол j1939 на практике через разработку собственного софта. Работаю автоэлектриком по комерческому транспорту. Открыт к предложениям по работе и стажировке. Хочу вкатиться в IT. Все исходники проектов доступны в моём репозитории github.

https://github.com/Data7Viz/data7-can

Комментарии (15)


  1. MountainGoat
    09.07.2026 16:05

    3D принтеры тоже на CAN работают. В обычной вороне 2 сидят 4 клиента на шине.


    1. DataViz Автор
      09.07.2026 16:05

      С принтерами я не знаком. Твое слово клиент мне понравилось. Например блок ABS EBS ECAS это клиенты. Или нулевой клиент это ДВС 11 клиент тормозная система.


  1. qwe101
    09.07.2026 16:05

    В лабораторном оборудовании тоже бывает CAN.


    1. DataViz Автор
      09.07.2026 16:05

      Я думаю она сейчас везде. По сути два куска проволоки.


  1. Radish
    09.07.2026 16:05

    CAN это хорошо, но русский надо подтянуть. Читать больно.


    1. NutsUnderline
      09.07.2026 16:05

      Тут уже проблемы не (только) с "языком" а с "писательством" Нейрослоп зачастую выглядит более человечно.

       вы пойдёте по этому мосту

      Писать свои инструменты

      ну это типа как плохой перевод с другого языка


    1. DataViz Автор
      09.07.2026 16:05

      Я вас услышал. К этому нужно отнестись по серьезный. Я не придал этому значение.


    1. DataViz Автор
      09.07.2026 16:05

      Учитель по русскому языку и литературе была Максенцова Светлана Петровна учила хорошо. А я не учился.

      Хорошо что статья короткая. Спасибо буду иметь ввиду.


  1. vadimr
    09.07.2026 16:05

    CAN это хорошо, но язык Си для работы с ним совсем не обязателен. Можно программировать на любом. На каком-нибудь питоне даже поудобнее, можно не париться с распределением и освобождением памяти.

    upd: Судя по вашим исходникам, вы и так особенно с этим не паритесь, но таком пути вас ожидают неприятные сюрпризы с битыми данными, Наивно рассчитывать, что всегда массивы будут заполняться до штатной длины.


    1. DataViz Автор
      09.07.2026 16:05

      Я с вами согласен разложить на биты и байты индификотор и поле данных j1939 любой язык подойдёт. Но в планах программировать микроконтроллеры поэтому С.

      По количеству элементов например PGN 16 разрядов максимальное количество этих элементов 65 535 + 0 это тоже значение итого 65 536 элементов расширение опускаем.

      65 536 колличество этих элементов больше ни когда не будет. То что касается счётчика у меня 32 разрядные инты без знака. Да здесь возможно переполнение. Но переполнить 4.3 миллиарда ? Тогда нужно сделать 64 разрядные переменные здесь я точно за пределы не выйду. arr [65536] да здесь много памяти не используется . 256 КБ Для современного устройства я думаю это не критично. Оптимизацией не занимался вообще. Единственное , что я делал адрес должен быть кратен размеру данных. Там где достаточно 8 разрядных переменных я обьявил 16.

      По поводу языков программирования я думаю у каждого своя стихия. Мое личное мнение автоэлектрику нужно осваивать си. Мне например была интересна тема память как тут с python. Мне интересен низкий уровень.


      1. ivaneska
        09.07.2026 16:05

        Извините, вы точно не бот? Ваш стиль изложения информации говорит или о рассеянности в целом или о том, что вы не человек) уж простите.


        1. DataViz Автор
          09.07.2026 16:05

          Нет не бот. Вся информация в битах и байтах. Есть github есть код. Я далеко не писатель.


  1. alcotel
    09.07.2026 16:05

    В линуксе многие CAN-адаптеры доступны через такой же интерфейс сокетов, что и сеть. Поэтому можно не только читать дампы, но и достаточно легко всё принимать самому в реальном времени.

    Но я всё-таки Си оставляю для микроконтроллеров, а для ПК - can-utils и python-can - наше всё.


    1. NutsUnderline
      09.07.2026 16:05

      canutils вообще то на C :) :) :)


      1. alcotel
        09.07.2026 16:05

        Я не работаю в команде поддержки can-utils или python-can, я пользователь готовых инструментов и библиотеки.

        Но в исходники can-utils вполне можете заглянуть, как в референс.