Непосредственно сама CAN шина используется уже много где, мне интересно её использование в автомобиле, хотя этой сферой можно и не ограничиваться. Тем более пару лет назад подвернулась такая возможность. Я посмотрел на общие спецификации — вроде бы ничего особо сложного нет. Посмотрел на программы, которые встречаются в интернете — и ни одна мне не приглянулась, у каждой не хватало чего-то такого, что казалось мне нужным на тот момент. Буду изобретать свой велосипед. Делаю свой CAN sniffer далее под катом.

CAN шина


Описывать технические подробности CAN шины в деталях — удел документации. В данной статье достаточно знать, что она:

  • имеет двухпроводное физическое подключение
  • бывают различные скорости передачи данных
  • для подключения уже имеются готовые микросхемы и даже готовые платы с распаянными деталями

Полистав странички одного известного интернет магазина из поднебесной, я заказал несколько различных вариантов шилдов и пошёл изучать особенности электрических сигналов в автомобиле. Подопытным автомобилем выступил LADA Kalina Cross с 127-ым мотором и электронным блоком управления ИТЭЛМА М74.5 CAN.

Подключаюсь в диагностический разъём OBD (контакты 6 и 14) и смотрю осциллографом, что там имеется. После поворота ключа зажигания начинают бегать пакеты с амплитудой до 2,5 В. Ставлю паузу на осциллографе и смотрю на пакет.


Заметны стартовые и стоповые биты, какие-то данные в пакете. На тот момент я уже знал, что скорость передачи данных ожидается 500 кбит/с, как наиболее частая для моторной CAN шины. Длительность пакета получается около 230 мкс и перед пакетом наблюдается довольно большая пауза в передаче данных. Масштабирую время и вижу три пакета и паузы между ними.


Если сложить длительность передачи данных и паузу между пакетам получается, что передача одной порции данных занимает около 1 мс.

К чему я это всё вывожу? А вопрос чисто практический: хватит ли скорости последовательного порта для передачи всех данных? И исходя из увиденного, можно сделать вывод, что скорость 500 кбит/с развивается внутри пакета, который занимает примерно четверть времени на передачу. Значит средняя скорость передачи будет вчетверо меньшей. На тот момент я ещё не располагал тестами скорости последовательного интерфейса Arduino и забегая вперёд скажу, что даже с самым распространённым преобразователем Serial to USB CH340 стабильно работает скорость в 2 Мбит/с.

CAN scanner на Arduino


Первый прибыл шилд для классической Arduino UNO. Да он стоит значительно дороже своих более мелких собратьев, но он имеет на борту всё необходимое и даже две кнопки.


Именно с ним я и начал все эксперименты. Собрал простую схему с этим шилдом и жидкокристаллическим двухстрочным экраном. Цель была — вывести на экран хоть какие-то данные. Перебирал различные библиотеки для работы с CAN шиной на Arduino (сразу скажу, что правильная и рабочая библиотека называется CAN-BUS Shield by Seeed Studio с заголовочным файлом mcp_can.h), поменял кварцевый резонатор на шилде на 16 МГц (изначально стоял 8 МГц) — данных не было.

На шилде установлены две микросхемы: контроллер CAN шины MCP2515 и драйвер CAN шины TJA1050. Почитав документацию и различные форумы, решил поменять TJA1050 на более каноничный драйвер MCP2551 и данные появились. Возможно TJA1050 была изначально неисправна, так как с её подключением двумя проводками ошибиться было очень сложно, к тому же я использовал OBD и DB9 разъёмы для подключения.

За пару часов был написан простой CAN scanner, который выводил на жидкокристаллический дисплей номер захваченного пакета, его ID и до 8 байтов данных этого пакета.


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

Про кнопочки
Вообще, эти кнопочки потом много для чего пригодились. Именно с ними я начинал тестирование управления некоторыми устройствами автомобиля.

Начало было положено, надо переходить к более интересной реализации.

CAN sniffer на Arduino


Задача стояла достаточно простая:

  • принимаем пакет из CAN шины
  • укладываем полученные данные в свою структуру
  • отправляем структуру через последовательный порт

С первыми двумя задачами я вообще не видел никаких проблем. Библиотека предоставляла прерывание при приёме очередного пакета данных и удобные функции для получения данных. А вот отправку данных в сторону компьютера решил сделать через библиотеку CyberLib, которая устраняет некоторые накладные расходы всей платформы Arduino, за счёт чего можно немного разгрузить процессор для обработки данных. Позже от этой библиотеки пришлось отказаться.

Для того, чтобы отправляемые данные корректно обрабатывались на стороне компьютера, перед каждой очередной порцией данных в поток вставляется префикс из четырёх байтов 0xAA55AA55 (почему-то вспомнились эти байты по последним двум байтам загрузочного сектора DOS, только они там были в другом порядке). Логика такая:

  • компьютер читает весь поток из последовательного порта и находит в нём искомую последовательность префикса 0xAA55AA55
  • сразу после префикса будут 4 байта идентификатора пакета
  • далее длина данных этого пакета, по ней контролируется длина всего пакета
  • до 8 байтов данных

На этом программная часть в Arduino, на тот момент, была завершена. Позже она была значительно переделана, но общая концепция не поменялась.

Так же я написал простой генератор пакетов данных для отладки, чтобы отлаживаться дома — он просто отправляет в последовательный порт пакеты со случайными данными, что позволяет отлаживать приложение на компьютере в комфортных условиях.

Примерно в это же время прибыли более миниатюрные компоненты Arduino Nano и Mini CAN shield.


Я спроектировал небольшой корпус, распечатал его и разместил внутри все компоненты.


Снаружи с одной стороны OBD разъём, с другой — Mini USB. Внутри имеется переключатель для терминирующего резистора.

CAN sniffer на PC с использованием wxWidgets


Набросал простую заготовку программы на C#, которая выводит в Grid получаемые данные. И пошёл проверять в автомобиль. Только пошёл не со своим ноутбуком, так как у него батарея давно приказала долго жить и использовался он как стационарный компьютер, а взял нетбук с очень слабым процессором. То что я увидел… Я ничего не увидел. Оба ядра загружены на 100%, интерфейс приложения не реагирует. Но на моём компьютере, который всё-таки значительно шустрее нетбука, с генератором случайных пакетов приложение нормально работало и отображало данные. Из этого я сделал вывод, что платформа .NET на слабых компьютерах мне не подойдёт, так как отлаживаться в полевых условиях я мог на тот момент только с тем нетбуком.

Ранее я в нескольких проектах использовал библиотеку wxWidgets и о ней у меня только приятные впечатления. Она легковесная, нет необходимости тащить с собой различные библиотеки и даже кросс-платформенная, что вселяет надежду, что интерфейсную часть кода можно перенести без значительных переделок на другие платформы. В конце статьи будет ссылка на скомпилированную программу, если возиться со всем этим не будет желания.

Как установить и скомпилировать wxWidgets для Visual Studio
Установка и компиляция
1. Скачать Windows Installer wxWidgets и установить, например, в папку C:\wxWidgets

2. Создать переменную окружения:
    WXWIN = C:\wxWidgets

3. Запустить командную строку Visual Studio и перейти в директорию:
    %WXWIN%\build\msw

4. Набрать две команды для компиляции:
    nmake /f makefile.vc BUILD=debug RUNTIME_LIBS=static
    nmake /f makefile.vc BUILD=release RUNTIME_LIBS=static

Настройка проекта в Visual Studio
1. В Visual Studio создать Win32 Project, с параметром Empty project.

2. В свойствах проекта для All configuration прописать пути в разделе VC++ directories:
    Include Directories:
        $(WXWIN)\include
        $(WXWIN)\include\msvc

    Library Directories:
        $(WXWIN)\lib\vc_lib

3. В разделе C/C++ — Code Generation изменить:
    Runtime Library для конфигурации Debug: /MTd
    Runtime Library для конфигурации Release: /MT

4. В разделе General изменить:
    Character Set: Use Unicode Character Set

5. Для добавления иконки exe-файлу надо добавить ресурсный файл со следующим содержимым:
    #include «wx\msw\wx.rc»
    wxicon icon app_icon.ico

6. Дополнительно, если необходимы привелении UAC, в разделе Linker — Manifest File:
    UAC Execution Level: requireAdministrator

Первый реализованный прототип на C++ и wxWidgets показал, что даже нетбук справляется с отображением данных в таблице и я приступил к разработке задуманного.

Архитектурно программа состоит из двух потоков: интерфейсный и поток работы с последовательным портом. Никаких невероятно интересных алгоритмов не применялось. Код обильно снабжён комментариями и должен быть довольно понятен. Ссылка на исходники будет в конце статьи.

Первое что было сделано — раскраска ячеек данных в таблице по давности получения этих данных. Уже в первом прототипе, глядя на 17 строк данных меняющихся непрерывно значений, я понял, что надо как-то различать свежие данные и данные, которые не изменяются или меняется редко. Сделал раскраску в два этапа:

  • впервые пришедшие данные выделяются зелёным цветом фона ячеек
  • данные пришедшие повторно и далее — выделяются красным фоном, который постепенно выцветает до белого если больше эти данные не меняются

Сразу же стало наглядно видно, какие ячейки вообще не используются, какие содержат сигналы счётчиков. Поиск же интересующих изменяющихся значений значительно упрощается. Здесь и далее все изображения анимированные. Если анимация не работает в статье (на некоторых мобильных браузерах) — кликайте по изображению для открытия полной версии анимации.



Далее мне захотелось всё-таки проверить, справляется ли последовательный порт с потоком данных. Для этого я на стороне Arduino добавил счётчики количества принятых пакетов и счетчик байтов в пакете. Эти счётчики отправляются на компьютер в пакете с идентификатором 0x000. Программа при получении этих данных не выводит их в таблицу, а отображает в отдельных информационных полях сверху. Полученные результаты даже весьма понравились. В среднем принимается до 750 пакетов/с со скоростью до 9,5 кБ/с, а это где в районе до 80 кбит/с, что вполне по силам последовательному порту. Но всё равно, обмен данными настроен по умолчанию на 500 кбит/с, пусть лучше будет запас.

Добавление возможности записи данных в журнал появилось после того, как подключил параллельно к OBD интерфейсу диагностический адаптер ELM327 и связав его с телефоном, попробовал читать различные данные. Данные пробегали настолько быстро, что увидеть их невозможно. Записав всё это в журнал, можно потом спокойно сесть и посмотреть передаваемые данные. Для этого в журнал могут записываться даже ASCII текстовые данные. Так же можно выбирать тип файла, символ разделитель и настроить фильтр пакетов кликом в таблице по указанному идентификатору пакета и нажатию кнопки «Добавить ID в фильтр» (по умолчанию записываются все данные), если запись всех данных избыточна.

Именно тогда пришло осознание, что все приложения для телефона, которые производят всякую «диагностику» через связку ELM327 и телефон, не общаются напрямую с CAN шиной автомобиля. Они всего лишь используют функционал диагностики OBD через CAN шину посредством обращения к CAN ID 0x7E0. Обычно это адрес контроллера мотора (ЭБУ), ответ же от него приходит в пакете с идентификатором 0x7E8. А вот все остальные пакеты данных — это так называемый Vendor Specific и ни один производитель так просто их не раскроет (хотя есть пример: Ford выпустил SDK для своих автомобилей).

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


Ну а двоичное представление позволяет искать различные битовые индикаторы. Например поиск индикаторов указателей поворота сводится к тому, чтобы включить их и наблюдать какая ячейка начинает изменяться, в примере ниже это CAN ID 0x481 байт 2. После чего клик по ячейке приводит к отображению её двоичного значения в соответствующем поле, где уже видны переключающиеся младшие два бита (левый, правый и если вместе — аварийная сигнализация).


И напоследок мне понадобилось сделать отправку некоторых управляющих данных в CAN шину и посмотреть реакцию на эти команды. В программу на Arduino был добавлен код, который принимает данные со стороны компьютера и передаёт в CAN шину. Именно на этом этапе пришлось отказаться от CyberLib, так как у неё не было поддержки прерывания поступления данных в буфер последовательного порта. В программе на компьютере добавил несколько текстовых полей, в которые можно ввести различные параметры и таблицу для просмотра ответа исполнительного устройства. В примере ниже показаны команды управления включить/отключить первую скорость вентилятора охлаждения (0x0A) и включить/отключить муфту кондиционера (0x0B).



Итог


Практически нигде не найти полные расшифровки данных производителей, тем более официальных. В лучшем случае это будут чьи-то изыскания в рамках реализации какой-то дополнительной функции. CAN sniffer может помочь в поиске этих данных. Я смог найти порядка 40 различных параметров автомобиля и ради эксперимента, на базе полученных данных, я сделал собственное управление вентилятором охлаждения.


Надеюсь, что всё это будет полезно не только мне.

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


  1. lingvo
    11.12.2019 18:31
    +2

    Отмечу, что для профессиональной разработки с использованием CAN стоит присмотреться к соответствующим продуктам, а не разрабатывать самостоятельно.
    Например я использую USB-to-CAN Адаптер от Ixxat. Есть аналогичные от Vector, Марафон.
    Во всех случаях такой адаптер поставляется с софтом, который обычно может гораздо больше, чем тот, что идет с различными no-name снифферами или самостоятельно разработанный. Также с адаптером идет отличный API для использования в любом софте.
    Ну и естественно там нет проблем с производительностью или гальванической развязкой, если надо.


    1. kababok
      11.12.2019 18:38

      Самый дешёвый со своим API был от PCAN в своё время. :)


      1. lingvo
        11.12.2019 19:08

        Да, есть и такой. Peakи всякие. Посыл был в том, что не надо экономить на этой штуке, если нужна для жизни. Хорошие дрова и поддержка всегда рулят.


    1. kababok
      11.12.2019 18:38

      Всё никак не спрошу — а вы в итоге в automotive перешли? Или это игры с CANopen? :)


      1. lingvo
        11.12.2019 19:05

        Или это игры с CANopen? :)

        Нет я в автомотив не перешел. И это не игры, а вполне серьезный проект. Только в другой области.


        1. kababok
          11.12.2019 19:40

          Только не принимайте, плз, моё "игры" серьёзно — я и про себя говорю, что в embedded играюсь, хоть наше эмбеддед — вполне суровое. :)


    1. KruFFT Автор
      11.12.2019 19:13

      Так и не метил я в профессиональную разработку с этим и хаб про «сделай сам». Хотя очень всё это интересно.


      1. lingvo
        11.12.2019 19:35

        Ну так я и не критикую! Просто для общего развития.


        Вы — молодец, что все сделали и описали!


      1. Trikveter
        13.12.2019 02:00

        отличное решение. спасибо
        была задумка, но нет времени на это. нормальный осциллограф недавно приобрёл)


  1. kababok
    11.12.2019 18:39

    Вы — молодец! Просто здорово! :)


    1. KruFFT Автор
      11.12.2019 19:28

      Спасибо. Приятно.


  1. kababok
    11.12.2019 18:40

    itelma — блин, ну вот такого народ ждёт, а не стотысячную статью о миллионах строк и линуксе в мультимедиа… :/


  1. peacefulatom
    11.12.2019 18:58

    Спасибо за статью. Вообще какие самые простые узлы автомобиля, которые работают по CAN, вы можете посоветовать новичку для экспериментов?


    1. KruFFT Автор
      11.12.2019 19:06

      Тут всё очень специфично и зависит от производителя и в большей степени даже от модели автомобиля. Так как даже на ВАЗе CAN-шиной объединены довольно много узлов: ЭСУД, Блок Кузовной Электроники, АБС, Комбинация приборов, Климатконтроль и так далее. Управлять даже какими-либо устройствами без соответствующей документации — практически как тыкать палкой в небо в надежде, что что-то сработает. В интернете можно найти примеры, как управляют Комбинацией приборов. Это наверно самый безопасный способ потренироваться. Её можно запустить одельно от автомобиля и пробовать посылать ей пакеты, смотреть на её реакцию. В принципе, если подать пакет со скоростью, то как минимум должна отклоняться стрелка скорости, может даже пробег будет считаться. То же и с оборотами мотора.


      1. safari2012
        12.12.2019 17:02

        Иногда, через скоростную CAN-шину в автомобиле передается даже звук между различными аудио-компонентами.


    1. kababok
      12.12.2019 00:09

      Да, если есть возможность, то наиболее наглядной будет "комбинация приборов".


      Можно попробовать, к примеру, кондиционерный блок или мультимедиаблок.


  1. kolu4iy
    11.12.2019 19:02

    Ой как вовремя вы нашлись!


    1. Есть некий софт, который зовут readlogs. Древний, зато в нем в виде текстовых файлов лежат расшифровки pid и формул к ним.
    2. Ещё не придумал, но я вас в покое не оставлю :)

    P.S. пытался вчера расковырять журнал opendiag с помощью этих pid, но времени пока не хватило.


    1. kolu4iy
      11.12.2019 19:03

      И да, читал м86 от весты. Очень похоже на м74 can.


    1. KruFFT Автор
      11.12.2019 19:11

      PID-ы стандартизованы в OBD, их описание есть в Wikipedia, но лучше смотреть английскую версию, там больше подробностей. И эти PID-ы к CAN шине не имеют прямого отношения. CAN шина живёт отдельно со своими данными и протоколом. А вот PID-ы в диагностическом режиме (эдакая замена K-line) внутри пакетов CAN 0x7E0 и 0x7E8.


      1. kolu4iy
        12.12.2019 09:52

        Вот я про замену K-Line и говорю, собственно. Меня больше прикладной уровень интересует :) И вот прикладной уровень в readlogs как раз интересен: проект вообще начинался с целью диагностики праворуких японок…


    1. kababok
      11.12.2019 19:41

      Посмотрите мои посты — может, чего накопаете. :)


      Эх, может, наконец, дойдут на каникулах руки до статьи. :))))


      1. kolu4iy
        12.12.2019 17:51

        Ваши с удовольствием посмотрел (во всяком случае, на хабре). Но это, так сказать, крупные мазки… А вот у автора этой статьи пошли интересные детали, которые приходится собирать из разрозненных источников. Сами понимаете — это не очень удобно, хоть я и не очень ленив. Потому очень-очень хотелось бы статьи и от вас.


        1. kababok
          12.12.2019 21:53

          Да по многому как раз надо бы хотя бы крупными мазками — на русском и основного самого нет.

          Но, с другой стороны, вот вам подробности интересны… :)

          Кстати, а что интересно?


          1. kolu4iy
            13.12.2019 09:52

            Понимаете, я как раз играю с одним из новых изделий автоваза. Надо сказать, что оно относительно современно, много ECU на CAN-шине, но есть вещи, которые вызывают вопросы. Есть софт, который частично отвечает на эти вопросы, а есть то, что надо исследовать. Тот софт, который у нас продаётся, в общем-то тоже самописный, и ответы даёт только на начальном уровне, при этом надёжно скрывая детали.
            Вот данная статья — про то, как человек наблюдает за CAN-шиной, а также объясняет что же такое ELM327 она мне была как бальзам на душу потому что в двух словах рассказано то, что размазано тонким слоем по половине рунета.
            То есть мои исследования носят исключительно прикладной характер для борьбы с некоторыми неприятными повадками автомобиля, и данная статья дала очень неплохое направление в какую сторону копать дальше.
            Что бы я от вас хотел узнать — не могу сказать, любой automotive будет интересен. Понимаете, я лет 15 не лез в автомобили, и только буквально вчера узнал про моментную модель управления двигателем, например. От того лично мне интересно всё, что появилось после bosch mp 7.0, в чём его ключевое отличие, и, главное, зачем :)


            1. kababok
              13.12.2019 10:02

              Тогда вам надо больше инфы по гибридам — там и двигатель по моменту, и электродвигатель во многих режимах. ;)


              Постараюсь кой-чего поискать, как на работу прийду (у меня, сейчас только 08:02 утра :)


            1. kababok
              13.12.2019 10:02

              Кстати, а у вас с языками на чтение доков как? :)


              1. kolu4iy
                13.12.2019 11:07

                Английский технический вполне. Остальные как-то… Не очень.


                1. kababok
                  13.12.2019 21:00

                  я не забыл — увы, некогда было


                  книгу по OBD взял


            1. lingvo
              13.12.2019 10:28

              всё, что появилось после bosch mp 7.0, в чём его ключевое отличие, и, главное, зачем :)

              Вряд-ли вы эту инфу снимите с CANа. Да и в открытом доступе ее не будет.


              1. kababok
                13.12.2019 21:01

                kolu4iy Lingvo прав — тут смотря как глубоко вы хотите закопаться


                в общем случае прошивок с исходными кодами в инете не найдете — может, даркнет, но тут я вообще не в курсе :)


  1. vagon333
    11.12.2019 20:01

    А в сторону CanHacker не смотрели?
    canhacker.com
    vk.com/canhacker


  1. kababok
    12.12.2019 00:12

    Смотрите: из-за особенностей CAN-стандарта чем у телеграммы меньший номер, тем более высокий приоритет она будет иметь.


    Соответственно, самые важные и критичные сигналы будут в телеграммах с маленькими номерами. Что вы и обнаружили для MCU.


    1. kababok
      12.12.2019 00:18

      Пятисотые телеграммы — то, скорее всего, телеграммы для системы кондиционирования, вентиляторов и пр.


      Примерно там же относительно низко будут телеграммы стеклоподъёмников.


    1. kababok
      12.12.2019 00:19

      А под "двигательными телеграммами" должны быть телеграммы ABS, иммобалайзера и пр.


    1. KruFFT Автор
      12.12.2019 00:37
      +1

      Именно так, вот неполный список:
      0x160 — педаль газа, дроссель
      0x180 — обороты мотора, некоторые параметры по мотору
      0x280 — приборы, скорость
      0x481 — двери, световые приборы, подогревы
      0x551 — приборы
      0x555 — климат-контроль
      0x560 — АКП

      АБС точно не помню, кажется в районе 0x35x.


      1. kababok
        12.12.2019 00:40

        Здорово! :)


        1. KruFFT Автор
          12.12.2019 00:47

          Ещё читал сигнал с датчиков АБС с каждого колеса, просто прирастающий счётчик, когда колесо вращается. Но тоже сразу номер не припомню.


      1. unabl4
        12.12.2019 10:08

        Если правильно помню, то тормозная система и система стабилизации имеют наивысший приоритет


  1. aivs
    12.12.2019 00:23

    Еще, чтобы легче было находить пакеты можно строить графики по каждому ID, жмешь газ и видишь, на каком ID график полез вверх — это обороты коленвала.


    1. esaulenka
      13.12.2019 15:42

      … а также степень нажатия на педаль, расход и ещё 100500 параметров, которые связаны с оборотами


  1. kababok
    12.12.2019 00:53
    +1

    По сути вы сейчас пишете свой CANoe/CANalyzer (продукты фирмы Vector Informatik, упомянутой выше в комменте lingvo :)

    Это сейчас программа, де-факто ставшая стандартом в разработке/отладке/тестировании сетей автомобиля. Стоит очень недёшево. :)

    Вот, к примеру:

    youtu.be/T4e5HQG2Vxk


    1. lingvo
      12.12.2019 08:18

      Да, и поэтому я бы предложил — софт отдельно, железо отдельно. Если вы сделаете так, что ваш софт будет работать с распространенными CAN-адаптерами, а не только вашим — то это наверняка бы увеличило полезность вашего труда.


      Чисто в качестве идеи


      1. esaulenka
        13.12.2019 14:29

        Вы, простите, готовы купить для автора "распространённые адаптеры"? Или предлагаете заниматься отладкой по переписке?


        1. lingvo
          13.12.2019 17:08

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


          1. esaulenka
            13.12.2019 19:35

            Ну так отлаживайте, пожалуйста :-)
            Там "протокол" в отдельный модуль выделен. В принципе, ничто не мешает его подменить.


            Я вот свой велосипед пилю на эту же тему (правда, сейчас забросил...).
            И вот совершенно непонятно, откуда у меня должно возникнуть желание поддерживать железо, которое я никогда не видел… Мотивация "может быть, кто-нибудь когда-нибудь будет использовать" какая-то слабая.


            1. kababok
              13.12.2019 21:03

              вы зря на lingvo так — у него действительно самые распространённое железо, которым пользуется большинство в немецком и европейском автостроении


              можно всякого полезного из такой совместной работы сделать :)


  1. peacemakerv
    12.12.2019 16:05

    А подскажите какие-то готовые решения для подключения некого датчика с выходом CAN к Андроид-планшету. И датчик и Андроид надо как-то продолжать питать, поэтому USB-OTG интерфейс подойдет ли тут?
    Или лучше универсальный какой-то адаптер CAN-to-WiFi (или CAN-to-Bluetooth) посоветуйте, минимально с пайкой чтобы возиться.


    1. lingvo
      12.12.2019 16:27

      Датчик какой? Промышленные обычно не с простым CAN, а CANOpen или DeviceNet.


      1. peacemakerv
        12.12.2019 16:32

        J1939, CAN2.0B standard or CAN2.0A