tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルVB2010 SerialPortのコントロール配列化
記事No11297
投稿日: 2014/07/22(Tue) 09:21
投稿者とも
お世話になります。
現在約10台のSerial機器(Bluetoothバーコードリーダー)をパソコンに接続し、情報収集するプログラムを作成しております。
【環境】
VB2010 / Windows7 64bit / Framework3.5

http://dobon.net/vb/bbs/log3-37/23024.html
このサイトを参考にし、作成しているのですが、受信イベントの部分のHandles以降及び、
ポート名で判断し、どのPortからの受信だったのかを識別する方法が具体的にわかりません。

    Dim TempStr As String ' 一時文字列
    Private testCom() As Ports.SerialPort

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        'シリアルコントロール配列の作成(ここでは5つ作成)
        Me.testCom = New Ports.SerialPort(4) {}
        'シリアルコントロールのインスタンス作成し、プロパティを設定する
        Me.SuspendLayout()
        Dim i As Integer
        For i = 0 To Me.testCom.Length - 1
            'インスタンス作成
            Me.testCom(i) = New Ports.SerialPort
            'プロパティ設定
            Me.testCom(i).PortName = "COM" & i.ToString
            Me.testCom(i).BaudRate = 38400
            Me.testCom(i).DataBits = 8
            Me.testCom(i).StopBits = 1
            'イベントハンドラに関連付け
            AddHandler Me.testCom(i).DataReceived, AddressOf Me.testCom_DataReceived
            Me.testCom(i).Open()
        Next i
    End Sub

    Delegate Sub RecvDataDelegate(ByVal RecvStr As String)

    Private Sub RecvData(ByVal RecvStr As String)
        ' 受信欄更新
        TextBox2.Text = RecvStr
        ' 受信履歴更新
        RichTextBox1.Text = RichTextBox1.Text + RecvStr + vbCr
        ' 受信履歴の最下行表示
        RichTextBox1.SelectionStart = RichTextBox1.Text.Length - 1
        RichTextBox1.ScrollToCaret()
    End Sub


    Private Sub testCom_DataReceived(ByVal sender As Object, ByVal e As Ports.SerialDataReceivedEventArgs) Handles ???

        Dim Recv As New RecvDataDelegate(AddressOf RecvData)
        Dim strReceived As String

        Try
            '受信データ読込
            'strReceived = SerialPort1.ReadExisting()??
            ' 受信文字列結合
            TempStr = TempStr + strReceived
            ' CR受信(受信完了)
            If strReceived(strReceived.Length - 1) = vbCr Then
                TextBox2.Invoke(Recv, TempStr)
                ' 一時文字列初期化
                TempStr = ""
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message, "受信エラー", _
                MessageBoxButtons.OK, _
                MessageBoxIcon.Error, _
                MessageBoxDefaultButton.Button3)
        End Try

    End Sub

[ツリー表示へ]
タイトルRe: VB2010 SerialPortのコントロール配列化
記事No11298
投稿日: 2014/07/22(Tue) 10:05
投稿者shu
>     Private Sub testCom_DataReceived(ByVal sender As Object, ByVal e As Ports.SerialDataReceivedEventArgs) Handles ???

『handles ???』は不要。AddHandlerがあるのでイベント処理は行われます。


testCom_DataReceived内で
Dim TrgPort = DirectCast(sender, Ports.SerialPort)

のようにしてsenderをSerialPort型に変換すれば
PortNameなどでどのポートからによるものか判断できます。

[ツリー表示へ]
タイトルRe^2: VB2010 SerialPortのコントロール配列化
記事No11299
投稿日: 2014/07/23(Wed) 10:17
投稿者とも
shu様
ありがとうございました。
> 『handles ???』は不要。AddHandlerがあるのでイベント処理は行われます。

勉強不足でした。

> testCom_DataReceived内で
> Dim TrgPort = DirectCast(sender, Ports.SerialPort)
> のようにしてsenderをSerialPort型に変換すれば
> PortNameなどでどのポートからによるものか判断できます。

以下のように変更し、無事実行できました。
目的の処理は実行できましたが、問題ありましたら、アドバイスお願いいたします。
なおCOMポート番号は変数で扱う予定です。


Imports System.IO

Public Class Form1

    Dim TempStr As String ' 一時文字列
    Dim byシリアル機器接続数 As Byte

    Private testCom() As Ports.SerialPort
    Private txt_受信() As System.Windows.Forms.TextBox
    Private rich_受信() As System.Windows.Forms.RichTextBox

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        '受信表示コントロールのコントロール配列化
        Me.txt_受信 = New System.Windows.Forms.TextBox(1) {Me.txt_受信1, Me.txt_受信2}
        Me.rich_受信 = New System.Windows.Forms.RichTextBox(1) {Me.Rich_受信履歴1, Me.Rich_受信履歴2}

    End Sub


    Private Sub btn_Open_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Open.Click

        Dim iInc As Integer
        byシリアル機器接続数 = Val(Me.txt_リーダー数.Text)

        'シリアルポートコントロールのインスタンスを作成しプロパティを設定する
        Me.SuspendLayout()

        'シリアルポートコントロールの配列作成
        Me.testCom = New Ports.SerialPort(byシリアル機器接続数 - 1) {}

        For iInc = 0 To Me.testCom.Length - 1
            'インスタンス作成
            Me.testCom(iInc) = New Ports.SerialPort
            'プロパティ設定
            Me.testCom(iInc).PortName = "COM" & (iInc + 3).ToString
            Me.testCom(iInc).BaudRate = 9600
            Me.testCom(iInc).DataBits = 8
            Me.testCom(iInc).StopBits = 1

            'イベントアンドラに関連付け
            AddHandler Me.testCom(iInc).DataReceived, AddressOf Me.testCom_DataReceived

            If Me.testCom(iInc).IsOpen = False Then
                Me.testCom(iInc).Open()
            End If

        Next iInc

    End Sub


    Delegate Sub RecvDataDelegate(ByVal RecvStr As String, ByVal iNo As Integer)

    Private Sub RecvData(ByVal RecvStr As String, ByVal iNo As Integer)

        ' 受信欄更新
        Me.txt_受信(iNo).Text = RecvStr
        rich_受信(iNo).Text = rich_受信(iNo).Text + RecvStr + vbCr

        ' 受信履歴の最下行表示
        rich_受信(iNo).SelectionStart = rich_受信(iNo).Text.Length - 1
        rich_受信(iNo).ScrollToCaret()

    End Sub

    Private Sub testCom_DataReceived(ByVal sender As Object, ByVal e As Ports.SerialDataReceivedEventArgs)
        'Throw New NotImplementedException

        Dim Recv As New RecvDataDelegate(AddressOf RecvData)
        Dim strReceived As String = ""
        Dim TrgPort = DirectCast(sender, Ports.SerialPort)
        Dim iNo As Integer


        Try
            ' 受信データ読込
            Select Case TrgPort.PortName

                Case "COM3"
                    iNo = 0
                    strReceived = testCom(iNo).ReadExisting()
                Case "COM4"
                    iNo = 1
                    strReceived = testCom(iNo).ReadExisting()

            End Select

            ' 受信文字列結合
            TempStr = TempStr + strReceived

            ' CR受信(受信完了)
            If strReceived(strReceived.Length - 1) = vbCr Then

                ' CR削除
                TempStr = TempStr.Remove(TempStr.Length - 1, 1)
                Me.Invoke(Recv, TempStr, iNo)

                ' 一時文字列初期化
                TempStr = ""

            End If

        Catch ex As Exception
            MessageBox.Show(ex.Message, "受信エラー", _
                MessageBoxButtons.OK, _
                MessageBoxIcon.Error, _
                MessageBoxDefaultButton.Button3)
        End Try

    End Sub


    Private Sub btn_Close_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Close.Click
        Call PortClose()
    End Sub

    Private Sub btn_END_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_END.Click
        Call PortClose()
        End
    End Sub

    'シリアルポートコントロールのClose処理
    Private Sub PortClose()

        Dim iInc As Integer

        For iInc = 0 To Me.testCom.Length - 1

            If Me.testCom(iInc).IsOpen = True Then
                Me.testCom(iInc).Close()
            End If

        Next iInc

    End Sub

End Class

[ツリー表示へ]