0

シリアルポートを介してモーターコントローラーと通信するためのgtkアプリケーション(C ++)を作成しています。私はLinuxUbuntuとtermioslibを使用しています。それを行うための最良の解決策についてアドバイスが必要です。だから私が持っている制約は次のとおりです:1-リクエストを送信すると、コントローラーがメッセージを返送します2-エラーが発生した場合、コントローラーはいつでもエラー通知を送信できます3-リクエストは[CRで終了したANSII文字列です] 4-コントローラーの答えは、[CR][NL]で終わるANSII文字列です。

(3)と(4)の関係で、シリアルポートをCANONICALモードで構成するのが適切だと思いました。GUI +(2)のおかげで、マルチスレッドについて考えました。シリアルポートにユーザー要求を書き込むメインスレッドと、コントローラーの応答を読み取るための他の無限スレッドです。いい考えだと思いますか?

2番目の質問:マルチスレッドを使用している場合、必要なときにデータを書き込めるようにしたいので、おそらくpthread_cond_waitを使用して、書き込み中に読み取りスレッドを停止/スリープする方法を見つける必要があります。私は正しいですか?ポーリングと選択機能を見たことがありますが、それらを本当に理解しておらず、正規モードと互換性があるかどうかわかりません。

マルチスレッドとシリアルポートを使い始めています。私はグーグル、フォーラムでたくさんのことを読みました...しかし、大量の情報は初心者にとって少し圧倒されます。

ご協力ありがとうございました。

4

1 に答える 1

0

GUI をシリアル ポートから分離するためにここで考慮すべき主なことは、遅延です。ユーザーが気付く特定の時間、ポートをポーリングする必要があるアクションを実行する予定はありますか? リクエスト/リプライを行っているだけで、それらのレイテンシーが非常に低い場合、ユーザーはおそらくそれらの遅延に気付かないでしょう。さらに、これらの非同期エラー メッセージを受信して​​も、私が想像するような顕著な遅延は発生しません。Init メッセージまたはそのようなものがコントローラーに送信された後に数秒の遅延が発生する可能性があるという事実を知っていない限り、アプリケーションをシングルスレッドに保つ方がおそらくはるかに簡単になります。

一方、これらの大きなレイテンシーがある場合、またはマルチスレッドをいじりたい場合は、すべての GUI 作業を行う 1 つのスレッドと、すべてのシリアル IO を処理する別のスレッドから始めます。これら 2 つのスレッド間でメッセージ パッシングまたはイベント通知を使用して、アクティビティを調整します。これは非常に簡単です。

于 2013-03-22T13:07:27.883 に答える