Просмотр сообщений
|
Страниц: 1 2 [3] 4 5 ... 58
|
31
|
Компиляторы и платформы / Linux / [Решено] Использование плагина VirtualCAN
|
: Март 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 Скомпилированную программу запускаем в одной терминальной сессии В другой сессии запускаем генерацию и передачу пакетов Или наоборот: и
|
|
|
32
|
Компиляторы и платформы / Linux / Re: Статическая привязка USB-устройств к портам
|
: Февраль 27, 2023, 16:42
|
С причиной переподключения портов, вроде, разобрался - просадка по напряжению питания. Совсем забыл про эту проблему: когда запускал малину, пришлось искать блок питания и приличный usb-кабель. Подобрал 3-х амперный зарядник, вроде стабильно заработало. А потом подключил два usb-преобразователя и начались фокусы. Придется тратиться на блок питания))
|
|
|
33
|
Qt / Вопросы новичков / Re: Modbus RTU. Запись в modbus регистр.
|
: Февраль 25, 2023, 17:21
|
Спасибо, но не помогло должен отправлять 01 06 00 01 00 05 18 09. А отправляет 01 06 00 01 00 00 D8 0A Это из-за особенности (или ошибки?) QModbusDataUnit, фрагмент C++ (Qt) QModbusDataUnit writeUnit; writeUnit.setRegisterType(QModbusDataUnit::HoldingRegisters); writeUnit.setStartAddress(reg); writeUnit.setValueCount(1); writeUnit.setValue(0,data);
Нужно заменить на C++ (Qt) QModbusDataUnit writeUnit(QModbusDataUnit::HoldingRegisters, reg, 1); writeUnit.setValue(0,data);
Почему так, не вникал, но можете почитать здесь: https://forum.qt.io/topic/90552/qmodbusdataunit-bug/4Еще есть ошибка в слоте on_pushButton_write_clicked (там у вас вместо адреса устройства передается стартовый регистр). Нужно C++ (Qt) void MainWindow::on_pushButton_write_clicked() { write_registr(ui->spinBox_addr->value(), ui->spinBox_reg->value(), ui->spinBox_writedata->value());//ui->spinBox_writedata->value() }
|
|
|
35
|
Qt / Вопросы новичков / Re: Modbus RTU. Запись в modbus регистр.
|
: Февраль 24, 2023, 20:10
|
Ошибка здесь: if (QModbusReply *lastRequest = modbusDevice->sendWriteRequest(writeUnit, num_device)){
Надо исправить на: C++ (Qt) QModbusReply *lastRequest = modbusDevice->sendWriteRequest(writeUnit, num_device); if (lastRequest){
То же самое и в read_registr.
|
|
|
36
|
Qt / Общие вопросы / Re: Категория журналирования QLoggingCategory
|
: Февраль 20, 2023, 18:57
|
Так и сделал. В конструкторе класса использовал setProperty("rtu_via_tcp", true), при создании объекта проверяю obj.property("rtu_via_tcp").isValid(). Сделал и выбросил на помойку Ограничился фильтром QLoggingCategory::setFilterRules(QString("qt.modbus.warning = false")); Таким образом потеряю пару лишних предупреждений, но с этим можно мириться.
|
|
|
37
|
Qt / Общие вопросы / [Решено] Категория журналирования QLoggingCategory
|
: Февраль 20, 2023, 12:00
|
Коллеги, понадобилось мне в одном из модулей Qt подкрутить журналирование. Я создал новую категорию, например, C++ (Qt) Q_DECLARE_LOGGING_CATEGORY(MODBUS_RTU_VIA_TCP),
присвоил ей имя C++ (Qt) Q_LOGGING_CATEGORY(MODBUS_RTU_VIA_TCP, "qt.modbus.rtu_via_tcp")
Соответственно, в модуле использую qCWarning(MODBUS_RTU_VIA_TCP) << что-то там... Это все я затеял, для того, чтобы фильтром C++ (Qt) QLoggingCategory::setFilterRules(QString("qt.modbus.rtu_via_tcp = false"));
управлять записью в журнал некоторых специфических сообщений, которые мне не нужны. Но беда в том, что в проме я не везде могу апдейтить эти библиотеки. Поэтому кое-где мне вместо вышеуказанного фильтра придется ставить C++ (Qt) QLoggingCategory::setFilterRules(QString("qt.modbus* = false"));
Вопрос состоит в том, как определить, существует ли категория MODBUS_RTU_VIA_TCP с именем "qt.modbus.rtu_via_tcp"? Заглянул в исходники qloggingcategory.h, там определен макрос C++ (Qt) #define Q_DECLARE_LOGGING_CATEGORY(name) \ extern const QLoggingCategory &name();
Т.е. определяется глобальная переменная. Знаю, что средствами C++ проверить наличие переменных невозможно. Но, может быть, в Qt есть какое-нибудь средство для этого? PS Пока составлял это сообщение, появилась мысль - в классе создать property, которую можно проверять. Правда, это не очень удобно, но надо подумать.
|
|
|
38
|
Компиляторы и платформы / Linux / [Решено] Статическая привязка USB-устройств к портам
|
: Февраль 17, 2023, 00:13
|
Коллеги, к малине подключены два преобразователя интерфейса USB/RS-485, операционная система назначает им имена: sergek@Home:~ $ ls -l /dev/*US* crwxrwxrwx 1 root dialout 188, 0 фев 7 18:20 /dev/ttyUSB0 crwxrwxrwx 1 root dialout 188, 1 фев 7 18:20 /dev/ttyUSB1
При длительной работе операционная система иногда меняет эти имена (по какой причине, не знаю, но недопустимо часто - иногда два раза в сутки, иногда пару раз за неделю): sergek@Home:~ $ ls -l /dev/*US* crwxrwxrwx 1 root dialout 188, 2 фев 8 10:12 /dev/ttyUSB2 crwxrwxrwx 1 root dialout 188, 3 фев 8 10:12 /dev/ttyUSB3
Естественно, программа, подключенная к этим портам по именам ttyUSB0, ttyUSB1 перестает работать. Чтобы программа использовала постоянные имена, сделал симлинки с помощью правил /etc/udev/rules.d/90-converters.rules: SUBSYSTEM=="tty", SUBSYSTEMS=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="0000", SYMLINK+="USR103", MODE="0777" SUBSYSTEM=="tty", SUBSYSTEMS=="usb", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="USR101", MODE="0777"
Теперь ссылки на порты, с которыми работает моя программа, не меняются, даже если операционка изменила их имена: lrwxrwxrwx 1 root root 7 фев 8 10:12 /dev/USR101 -> ttyUSB2 lrwxrwxrwx 1 root root 7 фев 8 10:12 /dev/USR103 -> ttyUSB3
lrwxrwxrwx 1 root root 7 фев 12 14:59 /dev/USR101 -> ttyUSB0 lrwxrwxrwx 1 root root 7 фев 16 19:46 /dev/USR103 -> ttyUSB2
Но подключение к физическим портам при смене их имен пропадает, программа все равно теряет соединение и перестает работать. Приходится ее перезапускать. Подскажите, пожалуйста, есть ли способ восстановить подключение кроме переоткрытия порта в самой программе?
|
|
|
39
|
Qt / Общие вопросы / Re: Запуск SUDO из-под обычного пользователя
|
: Февраль 15, 2023, 21:58
|
Во-первых, "обычный пользователь" должен быть включен в группу sudo. Вот работающий пример (password - пароль пользователя): C++ (Qt) void CLanConfig::chmod() { QStringList arguments; arguments << "-c" << "echo " + password + " | sudo -S chmod o+r " + path; process.start("/bin/sh", arguments); process.waitForFinished(); }
|
|
|
44
|
Qt / Многопоточное программирование, процессы / Re: Глобальная переменная в потоках
|
: Декабрь 30, 2022, 13:22
|
Как я уже упомянул, синхронизация при чтении меня не особо заботит - процесс циклический и пропуск или, наоборот, лишний сигнал не помешает. Нужно лишь включить или выключить профайлер. Поэтому atomic_bool по сравнению с volatile мне видится чересчур "достаточным" Впрочем, простая с виду тема затянулась, и это чревато тем, что не все начинают заглядывать, с чего все начиналось.
|
|
|
45
|
Qt / Общие вопросы / Re: программа не запускается
|
: Декабрь 29, 2022, 14:13
|
Выложите полный архив проекта, если хотите, чтобы вам помогли. А пока: удалите все Makefile.*, *.user и объектные файлы, повторите qmake и make.
|
|
|
|
|