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);
}
}