2013年12月12日木曜日

ゲート操作をしたい!

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 件のコメント:

コメントを投稿