none
SerialPortクラスのWriteTimeOutプロパティについて RRS feed

  • 質問

  • お世話になります.

    初めて投稿させていただきます.

     

    SerialPortクラスを使い,通信プログラムを作成しているのですが,

    WriteTimeOutプロパティの設定についてご教授願います.

     

    WriteTimeOutプロパティの値を-1に設定し,

    HandshakeプロパティをRequestToSendにした場合,

    通信相手が未接続のままWriteメソッドを実行すると,

    制御が返って来なくなります.

    この状態になると,ポートを閉じることもできなくなります.

    (Closeメソッドを実行後,制御が返ってこない)

     

    いったんこの状態になった後,元の状態に復帰する方法はありますでしょうか?

    もしくは,ハンドシェイクが有効な場合,

    タイムアウト無しに設定できないようにするべきでしょうか?

     

    開発環境はVS2005 StandardEditionです.

    よろしくお願いします.

    2006年11月27日 8:22

回答

  • 早速のご回答ありがとうございます.

     

    "Serial.InfiniteTimeout"は知りませんでした.

     

    今回は通信相手がFA機器で,通信の信頼性はあまり無いので,

    タイムアウト無しに設定できないようにする方向で検討いたします.

     

    大変参考になりました.

    またよろしくお願いします.

    2006年11月28日 9:15

すべての返信

  • 鈴木@KEGと申します。

     kyowam さんからの引用

    WriteTimeOutプロパティの値を-1に設定し,

    WriteTimeout = Serial.InfiniteTimeout  と、しているのですよね。

     kyowam さんからの引用

    HandshakeプロパティをRequestToSendにした場合,

    通信相手が未接続のままWriteメソッドを実行すると,

    制御が返って来なくなります.

    この状態になると,ポートを閉じることもできなくなります.

    (Closeメソッドを実行後,制御が返ってこない)

     

    いったんこの状態になった後,元の状態に復帰する方法はありますでしょうか?

    簡単な方法は無いと思います。

    SerialPort クラスをメインスレッドではなく、別スレッドが持っていたとしても、Writeはプロセスを落とすまで制御が返ってきません。

    フロー制御をハンドシェイクにする、しないに関わらず、アプリケーションの制御を失いたくないのならば、タイムアウトを設定するべきだと思います。InfiniteTimeout  の設定は、サンプル用途や、通信経路が信頼のおける状態で通信相手の挙動に従いたい場合、UIが無いなどの場合に、実装を簡略化する目的で使うと便利です。

    私の経験では、実用で利用する機会はありませんでした。

    #裏技として、デバイスドライバに割り込み掛けて、IOExceptionを発生することができれば Writeの制御を戻せます…

    2006年11月28日 7:03
  • 早速のご回答ありがとうございます.

     

    "Serial.InfiniteTimeout"は知りませんでした.

     

    今回は通信相手がFA機器で,通信の信頼性はあまり無いので,

    タイムアウト無しに設定できないようにする方向で検討いたします.

     

    大変参考になりました.

    またよろしくお願いします.

    2006年11月28日 9:15