В QT как я могу определить, когда порт USB переключается из последовательного режима в DFU при подключении к STM32

У меня есть приложение 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);
}
}

person SailorRick    schedule 19.08.2019    source источник


Ответы (1)


С точки зрения хост-системы, перезагрузка микроконтроллера в DFU будет выглядеть так, как будто исходное устройство было отключено, а вскоре после этого было подключено совершенно другое устройство.

Если вам нужно следить за этим, настройте обратный вызов libusb hotplug, чтобы вы получите уведомление, когда устройство DFU будет подключено.

person Community    schedule 19.08.2019
comment
Это то, что я делаю для Windows 10, так как новый драйвер Windows действительно отключается, но с драйвером VCP, похоже, это событие горячего подключения не отображается. Я постараюсь посмотреть, смогу ли я использовать эту функцию без конфликтов с QSerialport, просто чтобы посмотреть, что я могу получить от нее, и вернуться к вам. Спасибо за понимание - person SailorRick; 19.08.2019
comment
Используя вашу ссылку, я добавил ее в свой проект и связал библиотеку libusb, но теперь мне нужно ее вызвать, и я не знаю, какие значения мне нужно включить в вызов. У меня есть опыт работы с Qt, и он позволил мне многое сделать за короткое время, но некоторые из основных механизмов C и C ++ все еще недоступны. Согласно документам, мне нужны эти входные данные для моего вызова функции - person SailorRick; 19.08.2019
comment
‹H3› int libusb_hotplug_register_callback \ n int hotplug_callback (struct libusb_context * ctx, struct libusb_device * dev, событие libusb_hotplug_event, void * user_data). ‹/H3› как я понимаю, что я не знаю, что я могу использовать LIBUSB_HOTCH для некоторых из этих переменных LIBUSB_MOTCHPLU чтобы настроить обратный вызов в Qt, и некоторые другие тоже вне меня. Мне просто нужен быстрый QList QString, который говорит, в каком режиме находится драйвер, и это вернет мне int. - person SailorRick; 19.08.2019