一連のコマンドを送信し、応答を待機する
シリアル ポートを介した通信では、多くの場合、一連のコマンドを送信し、その後の応答を待機する必要があります。それぞれのコマンド。これは、特に通信相手のデバイスがコマンドの処理に時間がかかる場合には、困難になる可能性があります。 waitForReadyRead() などのブロック関数は、応答を待っている間にプログラムを停止させる可能性があります。
ブロック関数の問題
あなたが遭遇した問題は、readLines( ) は、特定のタイムアウト内に予期したキーワードが見つからなかった場合に false を返します。これは、タイムアウトが期限切れになる前にデバイスが応答の一部のみを送信した場合に発生します。
非ブロッキング ソリューション
この問題を解決するには、ステート マシンを使用して実装された、より非同期的なアプローチ。ステート マシンを使用すると、通信プロトコルのさまざまな状態を定義し、特定のイベントに基づいてこれらの状態間を遷移できます。
次のステート マシンについて考えてみましょう:
Qt のステート マシン フレームワークを使用してステート マシンを作成し、これらの状態を定義できます。 send()、expect()、および Delay() 関数を使用すると、コマンドの送信、特定の応答の待機、および遷移の遅延を行うことができます。
実装例
ステート マシンの実装例を次に示します。
class Programmer : public StatefulObject { public: Programmer(QObject *parent = 0) : StatefulObject(parent) { ... send(&s_boot, &serial, "boot\n"); expect(&s_boot, &serial, "boot successful", &s_send, 1000, &s_failed); send(&s_send, &serial, ":HULLOTHERE\n:00000001FF\n"); expect(&s_send, &serial, "load successful", &s_ok, 1000, &s_failed); } ... };
ステートを使用する利点マシン
ステート マシンを使用すると、次のような利点があります。
以上が一連のシリアル コマンドを非同期に送信し、応答を効果的に処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。