Russian Qt Forum

Компиляторы и платформы => Linux => Тема начата: sergek от Март 27, 2023, 20:31



Название: [Решено] Использование плагина VirtualCAN
Отправлено: sergek от Март 27, 2023, 20:31
Коллеги,
осваиваю шину CAN и, пока едет железка конвертера CAN-Ethernet, пробую работать с виртуальной шиной и плагином Qt virtualcan. Сделал тестовую программу (надергал кусочков из гуевого примера), программа запускается в командной строке в двух режимах - чтения (запуск ./virtcan без параметров) и передачи фреймов данных в виртуальную шину can0 (запуск с любыми параметрами, например ./virtcan 1). Если в разных терминальных сессиях запустить программу на запись в одной сессии и на чтение в другой, то все работает отлично - один экземпляр пишет, другой принимает.

Но проблема в том, что моя программа наотрез отказывается работать с утилитами командной строки из пакета can-utils (https://sgframework.readthedocs.io/en/latest/cantutorial.html). Т.е. если передавать в виртуальную шину данные из программы, а пытаться принимать утилитой candump, или, наоборот, передавать утилитой cangen или cansend и пытаться принимать программой, то это взаимодействие не работает. Можете подсказать, по какой причине?
При этом линуксовые утилиты, как и мой пример, прекрасно передают данные между собой.

Во вложении имеется мой тестовый пример, в архиве есть скрипт vcan.sh для создания виртуального устройства can0. Работаю я с Qt 5.13.0, Linux Home 4.19.57-v7+ armv7l (малина 3b+). Если кому-либо захочется повторить, то в linux нужно установить утилиты:
Код:
$ sudo apt install can-utils
После этого надо создать виртуальное устройство can0:
Код:
$ chmod +x ~/vcan.sh
$ ~/vcan.sh
Скомпилированную программу запускаем в одной терминальной сессии
Код:
$ ./virtcan
В другой сессии запускаем генерацию и передачу пакетов
Код:
$ cangen -v can0

Или наоборот:
Код:
$ ./virtcan 1
и
Код:
$ candump can0



Название: Re: Использование плагина VirtualCAN
Отправлено: sergek от Март 29, 2023, 11:12
Чтобы все работало, как я хотел, нужно использовать плагин для Linux сокета (вместо плагина "virtualcan" для виртуального подключения):
   
Код
C++ (Qt)
QString plugin = "socketcan";
Почему так - устройство виртуальное (vcan), а работает с плагином для реального железа, объяснить не берусь. Хотя, с другой стороны, почему нет?


Название: Re: [Решено] Использование плагина VirtualCAN
Отправлено: sergek от Май 06, 2023, 13:41
Кстати, коллеги, может, кому-нибудь пригодится.
Железку, через которую я хотел подключиться к шине зовут USR-CANET200. Если кто-нибудь захочет с ней работать, имейте в виду, что она передает в сеть TCP/IP не фрейм CAN, свой пакет со структурой: длина (1 байт), ID (4 байта), данные (8 байт). Длина этого фрейма - 13 байт (вместо 16 стандартных).