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