シリアル通信機能

download.gif サンプル コードのダウンロード (vbmigtips_SeriaPort.msi, 481 KB)

Visual Studio 2005 では、.NET Framework 2.0 のサポートによって、新たにシリアル通信の実装が簡単に行えるようになりました。そこで今回は、シリアル通信方法について紹介します。

Visual Basic 6.0 や Visual Basic .NET では、シリアル通信の実装のためのクラスやメソッドはサポートされていませんでした。一方、Visual Basica 2005 では、System.IO.Ports.SerialPort クラスや SeriaPort コントロールの追加により、シリアル通信機能の実装を簡単に行えるようになりました。今回は、SeriaPort コントロールを使用して、図1 のようなアプリケーションを作成します。

図
図 1

まず、SerialPor コントロールを、[ツールボックス] から Form にドラッグ & ドロップします (コントロールはフォームデザインの下部に配置されます)。そして、以下のコードを実行します。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Try
        SerialPort1.PortName = TextBox1.Text
        If SerialPort1.IsOpen = True Then
            MessageBox.Show("すでに" & SerialPort1.PortName & "は接続されています。", "エラー",         
			MessageBoxButtons.OK, MessageBoxIcon.Error)
        End If
        Call SerialPort1.Open()
    Catch ex As Exception
        MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
    End Try
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    If SerialPort1.IsOpen = True Then
    Call SerialPort1.Close()
    End If
End Sub

リスト1

「Private Sub Button1_Click( ... End Sub」でポートに接続し、「Private Sub Button2_Click( ... End Sub」でポートを切断します。上記(リスト1)の「SerialPort1.PortName = TextBox1.Text」で接続するポートを設定し、「Call SerialPort1.Open()」で指定したポートに接続します。「Call SerialPort1.Close()」で接続されているポートを切断します。

次に、接続されたポートへのデータ送信の実装を行います。実装コードは以下のとおりです。

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    If TextBox2.Text.Length = 0 Then
        MessageBox.Show("送信文字列を入力してください", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
        TextBox2.Focus()
        Exit Sub
    End If
    Try
        SerialPort1.WriteLine(TextBox2.Text)
    Catch ex As Exception
        MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
    End Try
End Sub

リスト2

上記(リスト2)の「SerialPort1.WriteLine(TextBox2.Text)」で、テキストボックスに入力したデータを接続しているポートに送信します。

続いて、接続先から送信されてきたデータを受信した際に発生するイベントプロシージャの実装を行います。データを受信した際に発生する DataReceived イベントハンドラの実装は以下のとおりです。

Delegate Sub AddDataDelegate(ByVal str As String)
Private Sub AddData(ByVal str As String)
    TextBox3.Text = TextBox3.Text + str
End Sub

Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    Dim strDataReceived As String
    Dim add As New AddDataDelegate(AddressOf AddData)
    Try
        strDataReceived = SerialPort1.ReadLine
    Catch ex As Exception
        strDataReceived = ex.Message
    End Try
    TextBox3.Invoke(add, strDataReceived)
End Sub

リスト3

DataReceived イベントハンドラは、フォームとは別スレッドによって実行されているため、安全にデータを呼び出すことができません。そのため、Invoke メソッドを使用して、テキストボックスにデリゲートを実装します。上記(リスト3)の「Delegate Sub AddDataDelegate(ByVal str As String)」で、シリアル通信イベントの処理を実行するための定義を行い、「TextBox3.Invoke(add, strDataReceived)」で、受信したデータを AddData メソッドによってテキストボックスに表示します。

リスト1 ~リスト3 を実装し、プロジェクトを実行します。図1 の上部のテキストに 接続するポートを指定し、[接続]ボタンをクリックしてポートに接続します。中部のテキストボックスにデータを入力し、[送信]ボタンをクリックします。すると、接続されているポート先のアプリケーションの下部に受け取ったデータが表示されます(図2)。

図
図 2