首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在QT中,当连接到STM32时,如何检测USB端口何时从串行模式切换到DFU?

在QT中,当连接到STM32时,如何检测USB端口何时从串行模式切换到DFU?
EN

Stack Overflow用户
提问于 2019-08-19 02:35:09
回答 1查看 943关注 0票数 0

我有一个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端口状态改变触发它的方法。

代码语言:javascript
复制
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);
}
}
EN

回答 1

Stack Overflow用户

发布于 2019-08-19 04:00:05

从主机系统的角度来看,将微控制器重新引导到DFU看起来就像原来的设备被断开了一样,之后不久又插入了一个完全不同的设备。

如果您需要注意这一点,请设置libusb热插拔回调,以便在附加DFU设备时通知您。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57549901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档