У меня есть приложение Qt5.12.4 MinGw64, в котором я хочу перехватить событие USB. В Windows 10 драйвер MS для STM / USB выдает сообщения об ошибках, и я могу использовать это в качестве триггера. Неэлегантно, но это работает, пока я не попытаюсь запустить его в приложении Win7-8.1, где драйвером является сторонний драйвер STM с оболочкой VCP. Я думаю, мне нужно принять libusb, чтобы попытаться поймать изменение состояния портов, но я не понимаю, как действовать дальше. Я вижу информацию о порте в диспетчере устройств, я просто не знаю, как к ней добраться. Некоторые вопросы возникают у меня в голове ....
1) Могу ли я просто позвонить в ОС, чтобы прочитать информацию о порте? (если да, то как?)
2) Могут ли libusb и QSerialport сосуществовать на одном порте?
3) Какие вызовы LibUSB1.0 сделать для запроса статуса порта?
4) Есть ли утилита Windows cli, такая как lsusb (wmic ??), где я мог бы очистить данные?
5) Какое решение, вероятно, будет лучшим кроссплатформенным решением?
Я использую этот триггер для запуска dfuse как процесса, который автоматически обновляет прошивку на моей плате STM.
Я просмотрел документацию libusb1.0, но не понимаю, как я могу ее использовать. Если это правильное решение, мы будем очень благодарны за пример того, как запрашивать данные и состояние Com-порта.
Я попытался использовать qDebug () для распечатки всех данных serialportInfo, находясь в состоянии serial или DFU, но там нет ничего полезного, что я мог бы использовать в качестве триггера.
Последовательный режим USB = информация о последовательном порте: («COM3», «Последовательное USB-устройство», «Microsoft», «00000000001A», «\\. \ COM3», «483», «5740», «1», «нет». данные "," 1 ")
Режим USB DFU = информация о последовательном порте: ("COM3", "N / A", "N / A", "N / A", "\\. \ COM3", "N / A", "N / A" "," нет данных "," нет данных "," нет данных ")
Мне нужно какое-то руководство относительно того, как получить эту информацию о порте, поэтому у меня действительно нет никакого кода, который имеет значение, но я включаю отрывок из моей функции рабочего процесса.
Этот код отлично работает, чтобы фактически выполнить загрузку прошивки. Мне просто нужен способ вызвать его из изменения состояния USB-порта.
void updateDevice_Dialog::update_firmware(QString fileName)
{
qDebug() << "Updating firmware: " << fileName ;
QDir dir;
ui->progress_label->setText("Preparing to update Firmware .....");
if(dir.setCurrent(QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation)+"/firmware"))
{
QSettings settings;
QString comPort = settings.value("USBPort").toString();
ui->progress_label->setText("Setting port to: "+comPort+" and starting download .....");
ui->avr_progressBar->setValue(0);
ui->avr_progressBar->setRange(0,100);
ui->avr_progressBar->setHidden(false);
progress_steps = 0; //reset avrProcess line output counter;
qDebug() << "Starting process for stm-dfu on serial port: " << comPort;
connect(avr_Process,SIGNAL(error(QProcess::ProcessError)),this,SLOT(process_error(QProcess::ProcessError)));
connect(avr_Process,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(process_finished(int,QProcess::ExitStatus)));
connect(avr_Process,SIGNAL(readyReadStandardOutput()),this,SLOT(process_readLine()));
connect(avr_Process,SIGNAL(errorOccurred(QProcess::ProcessError)),avr_Process,SLOT(kill()));
connect(avr_Process,SIGNAL(error(QProcess::ProcessError)),ui->avr_progressBar,SLOT(close()));
QString dfu_command = "\""+QCoreApplication::applicationDirPath()+"/Tools/\"dfusecommand -c -d --v --fn "
"\""+QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation)+"/firmware/\""+fileName;
qDebug().noquote() << "dfu command string is: "<< dfu_command << " Current dir is: " << dir.currentPath();
avr_Process->start(dfu_command);
avr_Process->waitForFinished(20000);
}
}