tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル 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
'***********************************************************************

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。