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

タイトル Re^2: VB2010 SerialPortのコントロール配列化
投稿日: 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

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

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