Коллеги,
осваиваю шину 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
Скомпилированную программу запускаем в одной терминальной сессии
В другой сессии запускаем генерацию и передачу пакетов
Или наоборот:
и