"Этот программист вместо текстовых мессенджеров переписываются через утилиту NetCat."

Пролог

Недавно я купил себе CAN-трансивер USB2CANFD_V1 и с удивлением обнаружил насколько же простой и лаконичный протокол заложили разработчики в прошивку STM32G0B1CBT6. Это протокол SLCAN. По сути serial CLI. И это оказалось очень кстати, ведь в программировании микроконтроллеров порой приходится работать с UDS протоколом. Как известно, UDS протокол работает поверх сетевого протокола ISO-TP. В этом тексте я написал под SLCAN простую отладочную утилиту для отладки процесса передачи данных по протоколу ISO-TP (ISO 15765-2).

В чем проблема?

Проблема в том, что переходники с USB на CAN и сопутствующий для них софт от вендоров как правило заточен только на что, чтобы просто отправлять отдельные атомарные CAN пакеты. А это только 8 байт данных. При этом для отправки надо заполнять payload пакетов мышкой в виде hex нимблов. А как отправить массив размер которого больше чем 8 байт? Для этого существует как раз протокол ISO-TP. Подробнее про него можно почитать тут. Однако вендоры переходников USB-CAN обычно не добавляют поддержку ISO-TP в свои GUI приложения. Да, есть плагины на С#, но прикручиваются они очень трудно.

В связи с этим возникла потребность написать на Си монолитную утилиту, которая позволит извлекать сырые ISO-TP данные из CAN шины, просто анализируя трафик ISO-TP.

Постановка задачи:

Написать на языке программирования Си Windows консольную PC утилиту, которая позволит передавать и принимать произвольные массивы данных через интерфейс CAN по протоколу ISO-TP. При этом использовать расширенную 29-битную адресацию (CAN 2.0 B).

В качестве переходника с USB на CAN использовать широко распространённый и дешевый CAN-трансивер USB2CANFD_V1 с Aliexpress.

Образно, говоря нужна утилита аналогичная NetCat, только для случая с CAN интерфейсом. Эдакая утилита memcpy по CAN шине. Только и всего.

Аргументы утилиты

Утилита должна на вход получить номер COM порта трансивера, битовую скорость CAN, свой адрес в протоколе ISO-TP (сетевой адрес).

Аргумент

Порядок

Варианты

Номер COM порта на котором примонтирован переходник USB2CANFD_V1

1

0; 1; 2; 3; 4; 5 и т д

Битовая скорость CAN шины

2

250k 500k 1M

IsoTp адрес отправителя

3

8 битное число

IsoTp адрес получателя

4

8 битное число

Данные

5

Hex строка

Я решил назвать утилиту CANcat по аналогии с утилитой NetCat, которая делает в сущности то же самое только не для CAN кадров, а для Ethernet пакетов. Плюс я каждый день вижу котов (cat).

Инструкция

Саму утилиту можно скачать тут. Затем надо взять два LapTop PC, соединить их через CAN шину переходниками USB2CANFD_V1. Теперь можно запускать CANcat и передать данные.

Отладка

Я подключил два переходника к одному LapTop. Операционная система увидела COM4 и COM6. Затем я запустил на исполнение два Windows экземпляра процесса CANcat с разным пучком опций.

Первую утилиту CANcat я сконфигурировал так. Тут ссс - это CLI команда конфигурации приложения. По сути через аргументы функции main передается CLI команда.

echo off
cls

set com_num=6
set can_bit_rate=250000
set src_addr=0xD

set options_bunch=%com_num% %can_bit_rate% %src_addr% 
CANcat.exe  ccc %options_bunch%  

скрипт пуска второго приложения CANcat

echo off
cls

set com_num=4
set can_bit_rate=250000
set src_addr=0xC

set options_bunch=%com_num% %can_bit_rate% %src_addr% 
CANcat.exe   ccc %options_bunch%  

Тут стоит отметить, что конфиги в приложение CANcat передаются через аргументы функции main. При этом ключи позиционные. Сначала COMport, затем битовая скорость, адрес источника адрес приемника и сами передаваемые данные в виде hex строки с префиксом 0x.

Открыв приложения CANcat разворачивается интерфейс командной строки, который дает возможность в текстовом режиме консоли отправлять hex массивы из одного процесса в другой процесс прямо через CAN шину.

Чтобы отправить данные надо использовать CLI команду iso_tp_send. Синтаксис команды прост. Даешь адрес получателя и пишешь сообщение ( iso_tp_send TargetAddr TxData ). Например iso_tp_send 0xd Hello_Com6_I_am_COM4

Чтобы закрыть приложение достаточно нажать кнопку Esc.

Что можно делать с утилитой CANcat?

++Вы можете отлаживать свой UDS протокол. Буквально подключаетесь к CAN шине автомобиля, автобуса, поезда или трактора и посылать сырые UDS пакеты. Метаданные от ISO-TP не будут мозолить вам глаза. Вы получите чистый UDS ответ без прочей шелухи.

++Образно говоря, вы можете свесить CAN шину с балкона на 24 этажа вниз (80 метров), через форточку подключиться на каждом этаже переходником USB2CANFD, запустить утилиту CANcat и у вас получится общедомовой чат среди жильцов одного подъезда. Получится народный текстовый мессенджер по CAN.

++Можно организовать военно-полевую связь через CAN шину. CAN позволяет протягивать провода до 5 км.

++Благодаря утилите CANcat вы можете по CAN передавать CLI команды в микроконтроллер по CAN и получать ответ в виде сырого ASCII текста.

Итоги

Удалось создать консольную windows утилиту для обмена данными по CAN с использованием протокола ISO-TP. Утилиту CANcat.

Надеюсь эта утилита поможет Вам в отладке протоколов работающих поверх ISO 15765-2.

Если есть пожелания по улучшению утилиты CANcat, то пишите в комментариях.

Словарь

Акроним

Расшифровка

SLCAN

Serial-Line CAN

CAN

controller area network

CLI

command-line interface

Ссылки

Название

URL

CAN-шина (Теория)

https://habr.com/ru/articles/939978/

Обзор USB-CAN переходника USB2CANFD_V1

https://habr.com/ru/articles/944112/

Обзор Протокола ISO-TP [ISO 15765-2]

https://habr.com/ru/articles/798489/

SLCAN Protocol (Serial-Line CAN)

https://github.com/mac-can/SLCAN

Почему Нам Нужен UART-Shell?

https://habr.com/ru/articles/694408/

Дистрибутив утилиты CANcat

https://github.com/aabzel/Artifacts/tree/main/can\_cat

Вопросы

--Почему интернет не стали прокладывать по CAN шине, а выбрали другой интерфейс 100Base-TX? 100Base-TX в 100 раз быстрее чем CAN

--Есть ли какая-нибудь бесплатная клиентская Windows CAN утилита, которая посылает и принимает по ISO-TP огромные массивы сырых данных (бинарные файлы)? Утилита, которая оперирует не на канальном уровне, а на транспортном и сетевом уровне модели OSI-7. Что-нибудь типа аналога программы NetCat, только не для Ethernet протокола, а для CAN протокола. https://github.com/aabzel/Artifacts/tree/main/can\_cat

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


  1. konstantin_bashkatov
    23.09.2025 20:56

    Надо будет испытать на своих адаптерах. Было бы удобно, если бы CANcat умел экспортировать сессии в формате, совместимом с SocketCAN/wireshark.


    1. aabzel Автор
      23.09.2025 20:56

      Надо будет испытать на своих адаптерах

      А что у Вас за адаптеры? Тоже поддерживают протокол SLCAN?