0

USBイベントをキャッチしたいQt5.12.4 MinGw64アプリがあります。Windows 10 では、STM/USB 用の MS ドライバーがエラー メッセージを出力し、それをトリガーとして使用できます。エレガントではありませんが、ドライバーが VCP ラッパーを備えたサードパーティの STM ドライバーである Win7-8.1 アプリで実行しようとするまでは機能します。ポートの状態変化をキャッチするために libusb を採用する必要があると考えていますが、どのように進めればよいか途方に暮れています。デバイス マネージャーでポート情報を確認できますが、アクセス方法がわかりません。いくつかの疑問が頭をよぎる……。

1) ポート情報を読み取るために OS 呼び出しを行うことはできますか? (もしそうなら、どのように?)

2) libusb と QSerialport は同じポートに共存できますか?

3) ポートの状態を問い合わせるには、LibUSB1.0 に対してどのような呼び出しを行いますか?

4) データをスクレイピングできる lsusb (wmic??) のような Windows cli ユーティリティはありますか?

5) 最適なクロス プラットフォーム ソリューションになりそうなソリューションはどれですか?

このトリガーを使用して、STM ボードでファームウェアの更新を自動的に行うプロセスとして dfuse を開始しています。

libusb1.0 のドキュメントを確認しましたが、どのように使用できるかわかりません。それが正しい解決策である場合、Com ポートのデータと状態を照会する方法の例が最も高く評価されます。

シリアルまたは DFU 状態で qDebug() を使用してすべての serialportInfo データを出力しようとしましたが、トリガーとして使用できる便利なものはありません。

USB シリアル モード = シリアル ポート情報: ("COM3", "USB Serial Device", "Microsoft", "00000000001A", "\\.\COM3", "483", "5740", "1", " noデータ」、「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);
}
}
4

1 に答える 1

0

ホスト システムの観点からは、マイクロコントローラーを DFU に再起動すると、元のデバイスが切断され、その後すぐにまったく別のデバイスが接続されたように見えます。

これを監視する必要がある場合は、libusb ホットプラグ コールバックを設定して、DFU デバイスが接続されたときに通知されるようにします。

于 2019-08-19T04:00:05.577 に答える