タイトル : Re^11: VB2005で、シリアル通信について 投稿日 : 2009/04/30(Thu) 13:22 投稿者 : AMI
アドバイスを元に下記のように変更しました。 オブジェクト生成を「WriteLine」の前で行うようにして、 動かした所、 一回目の bret = manualEvent.WaitOne(1000, False) の比較では、「true」が帰ってきているのですが、 二回目の送信時では、「false」が帰ってきており、 (ラインモニタ上では、レスポンスは返ってきているのは確認しました) パソコン側がうまく受信していないものと思い、 強引にGOTOで、「TRUE」になるまで、連続して再送処理をしたのですが、 何回しても「false」になり、無限ループ状態になってしまいました。 うまく受信するポイントがあるのでしょうか? '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ コマンドクリック Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Call Serial_Send("SD_AAA?") Label1.Text = sz Call Serial_Send("SD_BBB?") Label2.Text = sz End Sub '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 送信処理 Private Sub Serial_Send(ByVal Str_Send As String) Try Dim bret As Boolean '非シグナル状態でManualResetEventオブジェクトを作成 manualEvent = New ManualResetEvent(False) eee: _com.WriteLine(Str_Send) Call AddMessage("[SND]" + Str_Send) bret = manualEvent.WaitOne(1000, False) If bret = True Then 'bret = manualEvent.Reset Else GoTo eee End If Catch ex As Exception MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End Sub '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 受信処理 Private Sub _com_DataReceived(ByVal sender As Object, _ ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _ Handles _com.DataReceived Dim addmsg As New AddMessageDelegate(AddressOf AddMessage) 'Dim dev As SerialPort If e.EventType = SerialData.Chars Then Try sz = Trim(_com.ReadTo(vbCr)) Catch ex As Exception sz = String.Empty End Try manualEvent.Set() 'DataReceivedイベント(受信イベント)ハンドラはセカンダリスレッド(2次スレッド)から呼び出されます。即ち、受信イベント処理は2次スレッドで行われます。 'そのため Windows.Forms の UI 要素(コントロール)にアクセスする場合は Control.Invoke() メソッドを使用する必要があります。 txtMessage.Invoke(addmsg, New Object() {"[RCV]" + sz}) End If End Sub '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > > '送信処理 > > Private Sub Serial_Send(ByVal Str_Send As String) > > > > Try > > '送信コマンド発行 > > _com.WriteLine(Str_Send) > > Call AddMessage("[SND]" + Str_Send) > > > > > > Dim bret As Boolean > > '非シグナル状態でManualResetEventオブジェクトを作成 > > manualEvent = New ManualResetEvent(False) > |