RS485半二重通信を行うために、ゲート制御を行いたい場合があります。
ゲート制御とは・・・
RS485半二重通信では、2Wつまり通信ライン1本を複数の端末で共有します。
通信ラインは、通常ハイインピーダンスに保たれ、全端末は入力状態です。
同一時間上に送信できる端末は1台だけです。
送信する端末は、送信直前にゲートをONにして、出力モードになります。
そして必要なデータを送信し終えたら、ゲートをOFFにして通信ラインをハイインピーダンス状態に戻すのです。
これがゲート制御。
マイコンボード等は、アプリケーションプログラムが、ハードを直接制御するなんて当たり前の世界。
自分が出力したデータが完全に出力されたのか知る方法はあります。
だから、効率よくゲートをON・OFF出来るのですが・・・
Windowsだとそうはいきません。
なにしろ一般優先順位のスレッドは、10ms~15ms単位で動作させられている感じ。
そしてCOMポートへデータを送信しても、すぐには送信されず、一旦バッファリングされWindowsのタイミングで送信されるのです。
とうぜん、全てのデータが出力されたのかを知るすべはありません。
残念orz
送信バッファがからになった事を知る方法はいくつかありますが、それは必ずしも送信が終了した事にはなりません。
オシロスコープを使って実際に観測してみると、送信バッファエンプティイベントでRTSをOFFにしても、送信途中でOFFされてしまいます。
困ったな~
そうこうしているうちに、見つけました!
どうやらドライバが請け負ってくれるみたいです。
通信ポートをOPENした後に、DCB構造体を使って通信設定を行いますが、そのDCB構造体にそのフラグがありました。
RTS_CONTROL_TOGGL なるフラグがあるので、調べてみてください。
これをセットすれば、送信前にRTS ON。送信終了後にRTS OFFされます。
ただ、私が利用しているUSB変換シリアルは、動作が遅いです。
送信終了から数ms後にRTSがOFFされてました。
高速な端末が存在する通信ラインに接続すると、送信がぶつかってしまうかもしれません。
十分なWAITを設けてもらうか、COM→RS485レベルコンバーターが自動でゲート制御してくれるタイプを使わないとだめっぽいです。
このサイトは、広告収入により運営しております。
0 件のコメント:
コメントを投稿