

VB.netで、シリアル通信のタイムアウト処理について
http://msdn.microsoft.com/ja-jp/library/7ya7y41k …
このサイトのコードを、参考にしています。
------------------------------------ここから
Dim com1 As IO.Ports.SerialPort = Nothing
Try
com1 = My.Computer.Ports.OpenSerialPort("COM1")
com1.ReadTimeout = 10000
Catch ex As TimeoutException
returnStr = "Error: Serial Port read timed out."
Finally
If com1 IsNot Nothing Then com1.Close()
End Try
------------------------------------ここまで
この方法ですと、タイムアウトが発生したらポートを閉じるようですが、これを、送信したシリアルのデータを再度、送信させたいと思います。
そして、何度かリトライを掛けた後に、やっぱり駄目だったときに
ポートを閉じたいと思います。
どんな方法がありますか?
参考になりそうなサイトなどがありましたら、教えていただけませんか。
以上、よろしくお願いします。
No.2
- 回答日時:
あぁ、そういうやり方ですか。
それだと、Private Sub ButtonRsStart_Clickでは
仕込みするだけですからタイムアウトになりません。
だって、Readしてませんからね。タイムアウトは読み
込みを始めてから完了するまでの制限時間です。
よって、このメソッドではOpenメソッドの失敗で例外が
発生するくらいでしょうか。
Private Sub SerialPort1_DataReceived
こちらの方でタイムアウト時の処理を記述すべきです。
それにしても、何所にも「送信」している箇所が無い
ように見えますが、大丈夫なんでしょうか?
ご返答、ありがとうございます。
>Private Sub SerialPort1_DataReceived
>こちらの方でタイムアウト時の処理を記述すべきです。
と、言う事は、タイムアウトが発生したら、Private Sub SerialPort1_DataReceivedの中で処理出来るのでしょうか?
>それにしても、何所にも「送信」している箇所が無い
>ように見えますが、大丈夫なんでしょうか?
これは、別口で「送信」ボタンを設けているからです。
つまり、仕込み部、送信部、受信部という構成にしています。
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
この回答への補足
早速の御解答を戴きまして、ありがとうございます。
私の説明不足で申し訳ございませんが、私が書いたプログラム構造は次のようになっています。
'初期設定&ポートを開く
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
といった具合に、処理を分ければいいのでしょうか?
長くなりましたが、何卒、御教示ください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
C# シリアル通信でデータ受信時の欠損について
C言語・C++・C#
-
FORMが開いているかどうかの確認方法
Visual Basic(VBA)
-
SerialPortのDataReceivedイベントについて
Visual Basic(VBA)
-
-
4
シリアル通信の出力バッファと送信完了イベントについて
C言語・C++・C#
-
5
VB.NET2005 TextBox 高さ(Height) 変更
Visual Basic(VBA)
-
6
VB.NETで16進数が正しいかどうかの判定方法を教えて
Visual Basic(VBA)
-
7
Designer.vbは直接コードをいじってはだめ?
Visual Basic(VBA)
-
8
C#で通信処理。応答がない場合、すぐエラーにしたい
その他(プログラミング・Web制作)
-
9
ボタンをマウスで押し続けたときのイベント
Visual Basic(VBA)
-
10
VB.net でトグルボタンを実現したい
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
DataGridViewでセルクリックイ...
-
列挙型:次の要素を返す?
-
配列のメソッド
-
javascriptからjavaを呼び出したい
-
boolean型のフィールドとゲッタ...
-
final修飾子を使っているのに、...
-
JSPで<SELECT>の中にDBから持っ...
-
【sendkeysメソッドが動かずに...
-
onClickで関数呼出し後に、結果...
-
[log4j]ログ出力クラスでのメソ...
-
VBA コピーが出来ません…!
-
Labelコントロールに数字を代入...
-
VB.NETで正規表現を教え...
-
タブコントロールの問題 (VB)
-
VBA/FIND関数を使っての先頭文...
-
VBAでSaveAs使用し、指定してい...
-
PDFファイルから別ウィンドウで...
-
0歳児の指しゃぶりに関して
-
AccessレポートのラベルをVBAで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
配列のメソッド
-
mainメソッドのthrows節で設定...
-
final修飾子を使っているのに、...
-
0歳児の指しゃぶりに関して
-
javascriptからjavaを呼び出したい
-
DataGridViewでセルクリックイ...
-
JSPで<SELECT>の中にDBから持っ...
-
boolean型のフィールドとゲッタ...
-
Labelコントロールに数字を代入...
-
ウィンドウを最前面にできません
-
処理内容がほぼ同じメソッドの...
-
eclipse-Tomcatでのデバッグに...
-
CALLされていないメソッドを見...
-
FEM解析の読み方は?
-
エクセルVBAにおけるON TIMEメ...
-
Application.Wait の参照設定
-
コマンドプロンプト実行後に画...
-
VBA コピーが出来ません…!
-
drawStringで文字間隔の調整
おすすめ情報