QT を使用してハードウェア シリアル デバイスに接続しています。アプリケーションはターミナルの例にほぼ基づいていますが、通信は非常に同期する必要があるため、シリアル ハンドラは別のスレッドに存在します。接続は、FTDI チップセットを備えた 2xRS232 から USB へのアダプターを介して行われます。
シリアル通信は問題なく、接続、コマンドの送信などはできます。ただし、アプリケーションを終了してリロードすると、シリアル ポートがブロックされているようです。
COM1 を接続デバイスとし、COM2 は未接続です。
プログラムを実行し、ハードウェアと少し対話して終了すると、COM2 に接続しようとしない限り、次にプログラムを実行するときに COM1 に接続できなくなります (アダプターのデータ LED は点滅しません)。最初。これを試したら、通常どおり COM1 に接続できます。この動作は、ハードウェアのリファレンス ユーティリティでは見られないため、ポートを処理している何らかの方法が原因である必要があります。
私の近いコードは次のとおりです。
void mydevice::closeSerialPort()
{
this->stop();
serial->close();
emit serialClosed();
emit log("Serial port closed.");
}
serial
ですQTSerialPort
。最初に、ハードウェアの電源をオフにする停止コマンドが送信され (問題とは関係ありません。これは単に便利です)、次に、シリアルに終了コマンドを送信します。
メインウィンドウ用にサブクラス化された QWidget があり、終了時に次のコマンドを呼び出します。
/* In the constructor */
connect(this, SIGNAL(WindowClosed()), mydevice, SLOT(closeSerialPort()));
void mainwindow::closeEvent(QCloseEvent *event)
{
emit WindowClosed();
event->accept();
}
この動作には何か理由がありますか? どういうわけか開いているポートをブロックしていると思いますが、確かに、すでに開いていると不平を言うでしょう。
もう 1 つの奇妙な問題は、デバイスが COM1 にあり、それを自分のアプリケーションで開くと、他のユーティリティで COM1 が応答せず、デバイスが COM2 に表示されるということです。ただし、プログラムに戻って少しいじると、デバイスが再び COM1 に表示されます (ただし、他のアプリケーションでは常に COM2 に表示されます)。