我有一个Qt5.12.4 MinGw64应用程序,我想在其中捕获USB事件。在Windows 10中,用于STM / USB的MS驱动程序发出错误消息,我可以将其用作触发器。效果不佳,但是可以正常工作,直到我尝试在Win7-8.1应用程序中运行它,该驱动程序是带有VCP包装程序的第三方STM驱动程序。我认为我需要采用libusb来尝试捕获端口状态的变化,但是我对如何进行操作感到茫然。我可以在“设备管理器”中看到端口信息,但我只是不知道该怎么去。我脑海中有些疑问。...
1)我可以打一个OS来读取端口信息吗? (如果是,怎么办?)
2)libusb和QSerialport可以在同一端口上共存吗?
3)我如何调用LibUSB1.0来查询端口状态?
4)是否有Windows cli实用程序,如lsusb(wmic ??),可以在其中抓取数据?
5)哪种解决方案可能是最佳的跨平台解决方案?
我正在使用此触发器来启动dfuse,该过程会在STM板上自动进行固件更新。
我看过libusb1.0文档,但我不知道如何使用它。如果那是正确的解决方案,那么将非常感谢有关如何查询Com端口数据和状态的示例。
我尝试使用qDebug()在串行或DFU状态下打印出所有serialportInfo数据,但是没有什么可以用作触发器了。
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);
}
}
答案 0 :(得分:0)
从主机系统的角度来看,将微控制器重新启动到DFU中将看起来像是断开了原始设备的连接,之后不久又插入了一个完全不同的设备。
如果您需要注意这一点,请设置a libusb hotplug callback,以便在连接DFU设备时收到通知。