• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VB.netで、シリアル通信のタイムアウト処理について)

VB.netでシリアル通信のタイムアウト処理について

このQ&Aのポイント
  • VB.netでシリアル通信のタイムアウト処理について、タイムアウトが発生した場合にポートを閉じる方法について解説します。
  • VB.netでシリアル通信のタイムアウト処理を行うコード例や参考サイトを紹介します。
  • タイムアウトが発生した場合にシリアルのデータを再送信させたい場合や、リトライ回数を制限する方法についても説明します。

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

タイムアウトはWrite/Read(送受信)系メソッドで 発生します。そのメソッドをTry~Catchブロックで ハンドリングしないと意味ないでしょ。 掲題のプログラムはポートを開いて、タイムアウトの 時間を設定しただけですから、送受信していません。

xcode_15
質問者

お礼

ありがとうございます。 長らくお付き合いしていただきまして、感謝しております。 何とか解決できそうです。

その他の回答 (2)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

あぁ、そういうやり方ですか。 それだと、Private Sub ButtonRsStart_Clickでは 仕込みするだけですからタイムアウトになりません。 だって、Readしてませんからね。タイムアウトは読み 込みを始めてから完了するまでの制限時間です。 よって、このメソッドではOpenメソッドの失敗で例外が 発生するくらいでしょうか。 Private Sub SerialPort1_DataReceived こちらの方でタイムアウト時の処理を記述すべきです。 それにしても、何所にも「送信」している箇所が無い ように見えますが、大丈夫なんでしょうか?

xcode_15
質問者

お礼

ご返答、ありがとうございます。 >Private Sub SerialPort1_DataReceived >こちらの方でタイムアウト時の処理を記述すべきです。 と、言う事は、タイムアウトが発生したら、Private Sub SerialPort1_DataReceivedの中で処理出来るのでしょうか? >それにしても、何所にも「送信」している箇所が無い >ように見えますが、大丈夫なんでしょうか? これは、別口で「送信」ボタンを設けているからです。 つまり、仕込み部、送信部、受信部という構成にしています。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

次のように考えたら如何でしょう。 (1)ポートを開く。この時に例外が発生したら終了する。 (2)以下の(3)~(5)を既定の回数繰り返す。 (3)データを送信する。 (4)データを受信する。読み込めたらループを抜ける。 (5)タイムアウトなら(3)から繰り返す。 (6)ポートを閉じる。 Try     com1 = My.Computer.Ports.OpenSerialPort("COM1")     com1.ReadTimeout = 10000     For I As Integer = 1 To 5         Try             returnStr = con1.ReadLine()             Exit For         Catch ex As TimeoutException             returnStr = "Error: Serial Port read timed out."         Catch ex As Exception             returnStr = ex.Message             Exit For         End Try     Next     com1.Close() Catch ex As Exception     returnStr = "Error: Serial Port open failed." End Try

xcode_15
質問者

補足

早速の御解答を戴きまして、ありがとうございます。 私の説明不足で申し訳ございませんが、私が書いたプログラム構造は次のようになっています。 '初期設定&ポートを開く Private Sub ButtonRsStart_Click(ByVal sender ・・・) Handles ButtonRsStart.Click With SerialPort1 Try '例外処理のはじまり If .IsOpen = True Then 'ポートはオープン済み MessageBox.Show("すでに" & .PortName & "は接続されています。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If .PortName = PORTNUM.Text 'オープンするポート名を格納 .Open() 'ポートオープン .DiscardInBuffer() '入力バッファを、初期化する .DiscardOutBuffer() '出力バッファを、初期化する .ReadTimeout = 1000 'Time out (ms) Catch ex As TimeoutException 'Timeout 例外処理 MessageBox.Show(ex.Message, "Error: Serial Port read timed out.", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End With End Sub '受信イベントが発生したときの処理を記述します Private Sub SerialPort1_DataReceived(ByVal sender ・・・) Handles SerialPort1.DataReceived Try '1フレーム分を、読み出す。 ReceivedData = SerialPort1.ReadLine '受信処理をする。 Catch ex As Exception ReceivedData = ex.Message End Try End Sub --------------------------- ここまで このやり方ですと、タイムアウトのとき、 Handles SerialPort1.DataReceived の受信イベントが発生しなくて SerialPort1_DataReceived の処理をしないのではないでしょうか? もし、そうなら、次のように Private Sub SerialPort1_ErrorReceived() Handles SerialPort1.ErrorReceived (エラー処理) End Sub といった具合に、処理を分ければいいのでしょうか? 長くなりましたが、何卒、御教示ください。