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

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

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

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