Russian Qt Forum
Апрель 26, 2024, 06:10 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено] Использование плагина VirtualCAN  (Прочитано 7018 раз)
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 870


Мы должны приносить пользу людям.


Просмотр профиля
« : Март 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

« Последнее редактирование: Март 29, 2023, 11:12 от sergek » Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 870


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #1 : Март 29, 2023, 11:12 »

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

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 870


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #2 : Май 06, 2023, 13:41 »

Кстати, коллеги, может, кому-нибудь пригодится.
Железку, через которую я хотел подключиться к шине зовут USR-CANET200. Если кто-нибудь захочет с ней работать, имейте в виду, что она передает в сеть TCP/IP не фрейм CAN, свой пакет со структурой: длина (1 байт), ID (4 байта), данные (8 байт). Длина этого фрейма - 13 байт (вместо 16 стандартных).
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.076 секунд. Запросов: 22.