0

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 に表示されます)。

4

3 に答える 3

1

そのため、何が問題を引き起こしているのか正確にはわかりませんが、かなり単純な解決策があるようです。

2 つのスレッドがあり、それぞれが異なるシリアル デバイスを制御しています。シリアル構成には、QT の例 (端末) から盗んだダイアログからアクセスします。各スレッドには、この設定ダイアログのインスタンスがあります。ポートを選択するときに問題が発生したようです。たとえば、デバッガーでチェックすると、ダイアログ内のすべての選択が実際には同じ COM ポートを指しています。

とにかく、私はこれをスレッドセーフではないコードに仕立て上げ、プログラムを変更して、シリアル ポート名だけを要求するようにしました。これは、データ レート、ストップ ビット、パリティなどがハードウェアによって固定されて変更されないためです。これで問題は解決しました。

于 2014-01-31T01:15:48.973 に答える
0

考えられる答えは 2 つあります。

  1. メイン ウィンドウを閉じても、プロセスは終了しません。プロセスが実際に終了したことをどのように確認しましたか?

  2. qt の serialport モジュールを使用すると、FTDI のドライバーのバグが露呈します。考えられないことではありませんが、現時点では可能性は低いと思います。

個人的には、FTDI ドライバーのシリアル ポート エミュレーションの使用は見当たりません。正当な理由もなく、余分なレイヤーが追加されています。libftdiのようなものを使用したくない場合は、D2XX インターフェイスを使用してください。Windows では、D2XX と libftdi が実行可能な唯一の代替手段であることがわかりました。libftdi は、仮想マシンでは D2XX よりもはるかにうまく機能します。

于 2014-01-27T07:30:46.917 に答える
0

これが役立つかどうかはわかりません。

多作なpl2303で同様の問題があります(ただし同じではありません)。私の場合、ポートを閉じると(または起動時でも、開く前に!)、とにかく何らかの形でデータが受信され、ポートを開くとすぐに表示されます。

これは usb-rs232 アダプタでのみ発生し、ttyS0 (物理シリアル ポート) を使用すると問題は発生しません。

私にとっての解決策は、QSerialPort::open() の直後に QSerialPort::clear() に強制的にバッファをクリアさせることでした。これにより、readyRead シグナルが発行され、不要なデータが受信されるのを回避できます。

于 2015-05-02T10:44:26.597 に答える