

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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) VBAで重複した値のセルに色付けをしたい 1 2022/11/02 16:12
- その他(IT・Webサービス) 301リダイレクトの使い方について 7 2022/04/05 17:50
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- ビデオカード・サウンドカード 6ピン 8ピン 変換 2 2022/08/20 22:06
- 格安スマホ・SIMフリースマホ J-COMモバイル新規申込みについて質問です 先日J-COMモバイル新規申込みしました 数日後に発送 0 2023/07/13 16:15
- Visual Basic(VBA) 【VBAエラー】Nextに対するForがありません 対策について 5 2022/11/21 21:26
- WordPress(ワードプレス) ワードプレスのパーマリンク設定について 1 2023/02/11 19:08
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
このQ&Aを見た人はこんなQ&Aも見ています
-
C# シリアル通信でデータ受信時の欠損について
C言語・C++・C#
-
シリアル通信の出力バッファと送信完了イベントについて
C言語・C++・C#
-
SerialPortのDataReceivedイベントについて
Visual Basic(VBA)
-
-
4
シリアル通信でコマンドを送信し、戻ってきたら実行する
Visual Basic(VBA)
-
5
FORMが開いているかどうかの確認方法
Visual Basic(VBA)
-
6
VB.NET2005 TextBox 高さ(Height) 変更
Visual Basic(VBA)
-
7
VB.NETで16進数が正しいかどうかの判定方法を教えて
Visual Basic(VBA)
-
8
C#で通信処理。応答がない場合、すぐエラーにしたい
その他(プログラミング・Web制作)
-
9
SerialPort処理でInvokeメソッドを使用するとエラーが発生。
Visual Basic(VBA)
-
10
VB.net でトグルボタンを実現したい
Visual Basic(VBA)
-
11
VBコンソールアプリ(.NET Framework)でRS-232C通信したい。
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
mainメソッドのthrows節で設定...
-
エクセルVBAで、条件に一致する...
-
配列のメソッド
-
0歳児の指しゃぶりに関して
-
javascriptからjavaを呼び出したい
-
引数は省略できません。とのコ...
-
DataGridViewでセルクリックイ...
-
ヘルパーメソッドとはなんですか?
-
boolean型のフィールドとゲッタ...
-
VBA/FIND関数を使っての先頭文...
-
VBPをダブルクリックするとたま...
-
.ToStringのありなし
-
final修飾子を使っているのに、...
-
エラーの意味を
-
マインスイーパの作り方
-
エクセルVBAにおけるON TIMEメ...
-
メソッドのエラー
-
DBunitの期待値についての質問...
-
c#でC言語のstrtokに...
-
ListViewにて行追加
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
【sendkeysメソッドが動かずに...
-
mainメソッドのthrows節で設定...
-
VBA コピーが出来ません…!
-
DataGridViewでセルクリックイ...
-
コマンドプロンプト実行後に画...
-
0歳児の指しゃぶりに関して
-
エクセルVBAにおけるON TIMEメ...
-
javascriptからjavaを呼び出したい
-
配列のメソッド
-
CALLされていないメソッドを見...
-
final修飾子を使っているのに、...
-
Labelコントロールに数字を代入...
-
VBPをダブルクリックするとたま...
-
ウィンドウを最前面にできません
-
処理内容がほぼ同じメソッドの...
-
Application.Wait の参照設定
-
C#.net Define文
-
C# 演算 最大値 最小値 表現の仕方
-
Excel VBA でExcelを終了したい...
おすすめ情報