none
シリアルポートのタイムアウト RRS feed

  • 質問

  • ↓例で、MSCommで接続装置がないときのデータ送信時間に関して質問がございます。

    Dim Buffer As String ' 文字列型
     Buffer = "Data"
    MSComm1.Output = Buffer 'この処理に5-6秒かかる。

    アプリでSetCommTimeouts()やTimer()などの関数は使用していません。
    このタイムアウトはどこで設定されいると考えられますか?
    ICHなどのチップセットの中でしょうか?
    OSやPCIのレジストリーなどで確認する方法はございますか?
    タイムアウト値を0にすることはできますか?

    2012年11月27日 13:28

回答

  • そのものずばりAPIの「SetCommTimeouts()」で変更できたはずですよ。デバイスハンドルはMSComm.CommIDが使えます。

    参照は「GetCommTimeouts()」で。

    大本はコントロールチップの16750とかが持っていたんじゃないかったかと思います。大昔はCのOutpとかで設定してましたから。

    今はチップセット自体がUARTも兼ねているようですね。

    デバイスマネージャではタイムアウトの設定は出来ませんが、ドライバ自身も何らかの初期値は持っているでしょう。

    構造体でいくつかの値を入れるはずですが、、送受信のたびに書き換えるような性質のものではなかったと思うので、送受信データの最大長にあわせるということになりますし、大きめに取っておくのが普通です。というか、「0」は「永遠に待つ」という設定だったような。実際、あまりいじったことはありません。

    実際に「タイムアウト=0」となると、「CTSを待たずに送信する」ということですから、「フロー制御しない」というのと同じだと思いますよ。それ以外でも、相手の応答速度や送受信バイト数から計算して適切な値を設定しないと、送受信自体が出来なくなる場合があります。

    ちなみに、HandShake=0で実際に通信できなくなるのでしょうか?

    RS/CSを設定してある機器に対してHandShake=0で通信を掛ける、というのはよくやりますが、短絡ケーブルだと通信しないような相手でも、割と平気で通信します。バッファが一杯にならなければ使われない信号ですし。

    ここをどうしても変えられないのであれば、線が切れたりした場合には、ある程度の待ちはやむを得ないと思いますよ。

    単に相手なしでのデバッグ時の問題であれば、先にも書きましたが、通信自体をしないダミープロジェクトを作られることをお勧めします。



    • 編集済み HABRAK98 2012年11月28日 15:43
    • 回答としてマーク Umashika 2012年11月29日 13:36
    2012年11月28日 8:11

すべての返信

  • MSComm自体にはタイムアウトの設定はなかったと思います。

    線を外している、ということであればたぶん、ハードウェアフロー制御の影響でしょう。CTSが来ないから、送信が停まるんだと思います。

    HandShakingプロパティを使っていませんか?

    ハードウェアのタイムアウト設定はBIOSでできる機種もあったかな?あまり期待できないと思うので、HandShakingは使わないようにすれば、すぐ抜けてくると思います。

    相手機器がHandShakingを必要とする場合は、そう言うわけにはいかないかも知れませんが、なくても結構使えますよ。

    あとはRTS/CTS短絡ケーブルを相手機器なしでつないでおく、とか。

    たぶん、手元に実機のない過去の物件や、自宅や宿泊先でノートPCでデバッグするのに邪魔だ、というお話かと思いますが、そう言う場合は「プロジェクトのプロパティ」で「条件付きコンパイル引数」を適当に設定して、MSComm関連のステートメントをコメントアウトとかif分岐する、通信をかけないデバッグ用のプロジェクトを作るのが普通だと思います。

    「プロジェクト」→「プロパティ」→「実行可能ファイルの作成」タブで「条件付きコンパイル引数」に「NoComm=-1」にしておき、

    ソース上で

    #if Not NoComm then

        MSCOMM1.Output = <Command String>

    #Endif

    みたいな。ソース自体は変えずに済みますので。

    実際に通信するプロジェクトは当然「NoComm」を消しておきます。

    シリアルポートのないノートPCでデバッグするときは、そうしておかないとエラーで停まってしまいますからね。

    ちなみにパラメータ設定はコメント化しなくとも大丈夫で、「PortOpen」「Output」「Input」は必須、だったかと。

    2012年11月28日 1:01
  • ありがとうございました。

    MSComm1.Handshaking=3 → 0にして送信処理をすぐに次にステップに移りました。

    Ackが返らない、CTS信号がでないから停まってしまったようですね。

    シリアルポートのフロー制御で、タイムアウトはどこで設定されいると考えられますか?
    BIOSのことがでましたので、Intelチップセットなどで設定されているのでしょうか?
    ハンドシェイクが必要な機器ですので、無効にすることはできません。

    2012年11月28日 6:22
  • そのものずばりAPIの「SetCommTimeouts()」で変更できたはずですよ。デバイスハンドルはMSComm.CommIDが使えます。

    参照は「GetCommTimeouts()」で。

    大本はコントロールチップの16750とかが持っていたんじゃないかったかと思います。大昔はCのOutpとかで設定してましたから。

    今はチップセット自体がUARTも兼ねているようですね。

    デバイスマネージャではタイムアウトの設定は出来ませんが、ドライバ自身も何らかの初期値は持っているでしょう。

    構造体でいくつかの値を入れるはずですが、、送受信のたびに書き換えるような性質のものではなかったと思うので、送受信データの最大長にあわせるということになりますし、大きめに取っておくのが普通です。というか、「0」は「永遠に待つ」という設定だったような。実際、あまりいじったことはありません。

    実際に「タイムアウト=0」となると、「CTSを待たずに送信する」ということですから、「フロー制御しない」というのと同じだと思いますよ。それ以外でも、相手の応答速度や送受信バイト数から計算して適切な値を設定しないと、送受信自体が出来なくなる場合があります。

    ちなみに、HandShake=0で実際に通信できなくなるのでしょうか?

    RS/CSを設定してある機器に対してHandShake=0で通信を掛ける、というのはよくやりますが、短絡ケーブルだと通信しないような相手でも、割と平気で通信します。バッファが一杯にならなければ使われない信号ですし。

    ここをどうしても変えられないのであれば、線が切れたりした場合には、ある程度の待ちはやむを得ないと思いますよ。

    単に相手なしでのデバッグ時の問題であれば、先にも書きましたが、通信自体をしないダミープロジェクトを作られることをお勧めします。



    • 編集済み HABRAK98 2012年11月28日 15:43
    • 回答としてマーク Umashika 2012年11月29日 13:36
    2012年11月28日 8:11