タイトル : Re^9: VB2005で、シリアル通信について 投稿日 : 2009/04/30(Thu) 09:22 投稿者 : AMI
> > AddMessageした直後に > bRet = manualEvent.WaitOne(1000, False) > とかして、受信完了待ちするんですが・・・ > > 当然、受信イベントの方では、受信した直後に > manualEvent.Set > として、WaitOneしている部分の待ちを解除しま > す。 > > 受信が無い場合、1000ミリ秒のタイムアウトを > 設定していますので、bRet の真偽を判断して、 > 次処理を行うか、タイムアウト処理を行うか分 > 岐します。 早速のお返事ありがとうございます。 現在下記のようにコマンドボタンを押したときに、 2回送信を行い、受信を「sz」に受信しております。 そこで「SD_AAA?」を送信して、それを「Label1」に表示 次に、「SD_BBB?」を送信して、それを「Label2」に表示 としたいのですが、一回目受信した後に、 Call Serial_Send("SD_BBB?") Label2.Text = sz 上記処理をしているのですが、送信して、受信待ちしてないみたいで、 Label2.Text = sz を通過した後に、受信処理が走って、szが更新されます。 (現状では、一回目のszの値がそのまま保持されていて、Label1・Label2ともに 同じ値です) 現状のコードを記載します。 '*********************************************************************** 'コマンドクリック処理 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 '送信コマンド発行 _com.WriteLine(Str_Send) Call AddMessage("[SND]" + Str_Send) Dim bret As Boolean '非シグナル状態でManualResetEventオブジェクトを作成 manualEvent = New ManualResetEvent(False) 'スレッドを作成し、開始する Dim t1 As New Thread(New ThreadStart(AddressOf MyMethod)) t1.Name = "1" t1.Start() 'シグナル状態になるまでスレッドをブロックする 'manualEvent.WaitOne() bret = manualEvent.WaitOne(1000, False) If bret = True Then 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) 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 '*********************************************************************** |