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