シリアル通信機能
サンプル コードのダウンロード (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