問題タブ [qtserialport]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
33245 参照

c++ - Qt とシリアル ポートのプログラミング

Qt にシリアルポート機能はありますか?

そうでない場合、どのクロスプラットフォームの(望ましい)ライブラリ(シリアルポート、およびおそらく他のI / Oポートでの作業用)をお勧めしますか?

0 投票する
2 に答える
28572 参照

c++ - Qt Serial Port - 一貫してデータを読み取る

シリアル ポート経由でデバイスにバイトを送信 (書き込み) しています。QSerialPort ( http://qt-project.org/wiki/QtSerialPort ) モジュールを使用して、デバイス IO サポートをインスタンス化しています。メッセージを INSTEON モデム (シリアル) に送信すると、メッセージを読み取ると、デバイスはメッセージのコピー + 0x06 (ACK バイト) とそれに続くステータス メッセージを返信します。

DockLight ( http://www.docklight.de/ ) を使用してメッセージをテストしました。次のメッセージを送信して、デバイスの状態を照会します。

Docklight を使用すると、次の応答が返されます。

返されたメッセージは、デバイスがオンになっていることを正確に示しています。オフの場合、デバイスがオフの場合、モデムは最後のバイト位置で 0x00 を返します。さて、私の問題-応答バイトを送信してから受信するために、関数を適切にセットアップしてはいけません。私は多くの異なる例と構成を試しましたが、現在は以下を使用しています:

シグナルスロット接続をセットアップします。

デバイスの QList を反復処理するために使用される関数。デバイスが目的のタイプ (「ライト」) の場合、デバイス ID を目的の QByteArray メッセージ構造にフォーマットします。メッセージをスレッドに渡して送信します。(QSerialPort のBlockingMaster例から変更されたスレッド。

SetupThreadローカルスレッド変数を設定し、スレッドを実行 (実行) するために使用される関数。

Run機能 - 送受信の処理

handleResponse関数、応答信号を受信する SLOT

次の出力が表示されます。

ここで2つの問題。

  1. 2 番目のデバイス (Bedroom Light) に関する応答がありません。これが 2 番目に送信されたメッセージです。送信がブロックされているようです。最初の送信で応答が受信された後に送信するように、送信をどのようにフォーマットすることをお勧めしますか? 送受信に使用できる COM ポートは 1 つだけです。デバイス 1 にメッセージを送信し、デバイス 1 の応答を受信し、デバイス 2 に送信し、デバイス 2 を受信する必要があると思います。デバイス 2 の通信プロセスを実行する前に、デバイス 1 の通信プロセスが終了するのを待ちますか?

  2. 最初の読み取りには、受信の適切な前半が含まれます。Read: "026220cbcf05190006"2 番目の受信には、最初の応答の後半と 2 番目の応答の前半が含まれます。 Read 2 -Read: "025020cbcf1edaf721000002621de94b05190006"適切な完全な応答は次のとおりです (完全な応答の例では、デバイス 2 の ID に02621DE94B05190006 025020CBCF1EDAF72100FF 注意してください)。20CBCF

シリアルポートからデータを受信する方法を修正する必要がありますか? ありがとうございました!

0 投票する
2 に答える
1736 参照

c++ - QtSerialPort が間違ったスレッドでインスタンス化され、シグナル/スロットが失敗する

QtSerialPortライブラリを使用して、USB 経由で仮想 COM ポートと通信しています。COM ポートはデータを返し、QtSerialPort で指定されたサンプル プロジェクトでテストすると正しく動作しますが、プロジェクトの一部として実行すると失敗します。

QtSerialPort がインスタンス化されるまでのインスタンス化チェーンとスレッドを調べたところ、少し奇妙なことがわかりました。結果は以下のとおりです。

私のコードでは、main() 関数が MainWindow をインスタンス化し、次にそれが HardwareManager をインスタンス化し、それをプライベート変数として格納します。HardwareManager がインスタンス化されると、QSerialPort インスタンスもインスタンス化されるため、COM ポートと適切に通信できます。

ただし、上記のように、私の QSerialPort は親オブジェクトとは別のスレッドにあり、親オブジェクトでもあります (両方の祖先がスレッド A にあるのに対し、スレッド B にあります)。この他のスレッドが私のシグナル/スロットの失敗を引き起こしていると思います。dumpObjectInfoを実行すると、Signal/Slot が設定されていると表示されますが、イベントは発生しません。

上記は、新しいシリアル ポートを作成して適切なスロットに接続するために使用するコードです。実際のボー、パリティ、およびデータ/ストップ ビットの構成は個別に行われます (QtSerialPort が提供するサンプル アプリでテストされているように、正しく動作します)。

この特定のオブジェクト (QSerialPort インスタンス) が別のスレッドでインスタンス化されている理由について、誰かが洞察を持っていますか? スレッドの関連付けを切り替えるために「moveToThread」を試しましたが、何も機能していないようです。

Qt Project Forumsにも投稿しましたが、有用な回答はまだありません。

編集: 以下は、コール チェーン内の関連するコードです。

QSerialPort から読み取る準備ができると (提供するデータがある場合)、readyReadシグナルを発します (少なくとも、発火するはずです)。このシグナルは Qt のサンプル プロジェクトでは正しく発火しますが、私のアプリケーションではシグナルを受け取りません。シグナルが届かないのは、これらのスレッドの問題が原因だと思います。

0 投票する
1 に答える
502 参照

c++ - QtクリエーターでQtSerialPortをコンパイルできません

git から qtserialport ファイルをダウンロードし、qt-creator でコンパイルしようとしました。最初は「Build」オプションを試しましたが、「Run qmake」も試しました。

どちらも私に同じ結果を与える

:-1: エラー: 実行に失敗しました: C:\Qt\Qt5.0.1\5.0.1\msvc2010\bin\syncqt.bat -module QtSerialPort -mkspecsdir C:\Qt\Qt5.0.1\5.0.1\msvc2010/ mkspecs -outdir C:/qtserialport-build-Desktop_Qt_5_0_1_MSVC2010_32bit-Debug C:/qt-qtserialport

0 投票する
1 に答える
5043 参照

qt - Qt でのシリアル ポート通信

Qt は初めてで、rs232 から 16 進コマンドを送信するプロジェクトを準備する必要があります。QString 行には、16 進数に変換して rs232 経由で送信する必要がある 64 ビットのバイナリ データが含まれています。

では、QString 行の 64 ビット バイナリ データを 16 進数値に変換し、rs232 経由で転送するにはどうすればよいでしょうか。

0 投票する
1 に答える
7527 参照

multithreading - マルチスレッド コードの QSerialPort に関する Qt エラー: QCoreApplication::sendEvent: "別のスレッドが所有するオブジェクトにイベントを送信できません

serialPort を削除すると、デバッグ ビルドで次のメッセージが表示されます。

QCoreApplication::sendEvent での ASSERT エラー: 「別のスレッドが所有するオブジェクトにイベントを送信できません。現在のスレッド c0a528。レシーバー '' (タイプ 'QSerialPort') がスレッド c76850 で作成されました」、ファイル kernel\qcoreapplication.cpp、行 532

メイン ウィンドウを閉じると、~QSerialReader で実際のエラーが発生します。これがコードです。

edit1: ペッペの提案:

QSerialReader を QDataReader のメンバーに変更すると、問題はなくなります。しかし、QSerialPort::open でポートを開くと、次のエラーが表示されます。

QObject: 別のスレッドにある親の子を作成できません。(親は QSerialPort(0xdf6930)、親のスレッドは QThread(0xd8a528)、現在のスレッドは QThread(0xdf6850) QObject: 別のスレッドにある親の子を作成できません。(親は QSerialPort(0xdf6930)、親のスレッドは QThread です) (0xd8a528)、現在のスレッドは QThread(0xdf6850) です

QSerialPort::open(xx) は serialReader.readData() 内で呼び出されます。

それでも...厄介な問題があります。数年前に Java でコーディングしたときは、このような問題はありませんでした。

CSerialReader が作成されたときのスタック トレース (メンバー変数として)。これはメインスレッドで呼び出されます。

0 投票する
3 に答える
8477 参照

c++ - Qt 4.7 QtSerialPort/QSerialPortInfo: そのようなファイルまたはディレクトリはありません

Qt 4.7.4Qt Creator 2.4.1を使用しています。Qtサイトにある例のように、シリアル通信用のblockingmasterコードを構築しようとしています。

しかし、プロジェクトをビルドしようとしたときに、環境とパスの宛先に必要な変更を加えた後。それは私に与えます:

このリンクをたどった後(成功しませんでした);

私の .pro ファイルは次のようになります。

しかし、エラーは同じままです。私は物事を逆さまにしてみました。

QTを介したシリアル通信は私にとって新しいタスクなので、QtのWebサイトにある例を試していました。このエラーを取り除くための詳細情報を提供してくれる人はいますか?

0 投票する
2 に答える
10229 参照

c++ - Qtシリアルポート通信

シリアル ポート経由で別のコンピューターと通信する Qt アプリケーションを作成しています。私には2つの本当の問題があります。

1. データを正常に送受信できますが、シリアル ポートが入力の一部を「食べる」ことがあります。たとえば、私が送信した場合:

場合によっては (常にではありません)、次のもののみを受け取ります。

(これは端末であるため、入力をエコー バックします。また、私のプロンプトは、明らかに間違った場所にいることを示しています。)

2. また、受信できるデータがあることを知っていても、利用可能なデータがあるときに起動する Qt スロットが起動しないことがあります。別のポートを送信\r\nすると、スロットが起動します。たとえばls、コマンド名がポートから読み返されることがありますが、もう一度リターンを押すまで、フォルダーの内容はそこに置かれています。次に、ディレクトリのリストと 2 つのプロンプトを取得します。

これが私のコードです:

0 投票する
3 に答える
2171 参照

c++ - 通信 Arduino-C++ Arduino を読み取らない

次のコードがあります。

そしてArduinoの次のコード:

最初に 'a' を Arduino に送信すると、ARDuino は 'b' で応答する必要があります。しかし、Arduinoのポートを読み取ると、「」しか受信しません。

「b」ではなく「」を受け取る理由を知っている人はいますか? 御時間ありがとうございます。