我有一个Qt5.12.4 MinGw64应用程序,我想捕捉一个USB事件。在Windows 10中,用于STM/USB的MS驱动程序发出错误消息,我可以使用它作为触发器。不优雅,但它的工作,直到我试图运行在一个Win7-8.1应用程序,其中驱动程序是一个第三方STM驱动程序与VCP包装。我想我需要采用libusb来尝试捕捉港口状态的变化,但我对如何进行感到困惑。我可以在设备管理器中看到端口信息,我只是不知道如何获得它。我脑子里有些问题.
1)我可以直接调用OS来读取端口信息吗?(如果是,怎么做?)
( 2) libusb和QSerialport能共存在同一个端口上吗?
3)我对LibUSB1.0进行了哪些调用来查询端口状态?
4)有像lsusb这样的Windows cli实用程序吗?在那里我可以刮掉数据?
5)哪种解决方案可能是最好的跨平台解决方案?
我使用这个触发器启动dfuse作为一个进程,自动在我的STM板上进行固件更新。
我已经查看了libusb1.0文档,但我不知道如何使用它。如果这是正确的解决方案,那么最好给出一个如何查询Com端口数据和状态的示例。
我尝试使用qDebug()打印出所有的serialportInfo数据,而在串行或DFU状态下,但是没有任何有用的东西可以用作触发器。
USB串行模式=串口信息是:("COM3“、"USB串行设备”、"Microsoft“、"00000000001A”、“\\COM3 3”、"483“、"5740”、"1“、”无数据“、"1")
USB模式=串口信息是:("COM3“、"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);
}
}发布于 2019-08-19 04:00:05
从主机系统的角度来看,将微控制器重新引导到DFU看起来就像原来的设备被断开了一样,之后不久又插入了一个完全不同的设备。
如果您需要注意这一点,请设置libusb热插拔回调,以便在附加DFU设备时通知您。
https://stackoverflow.com/questions/57549901
复制相似问题