VB.NETでシリアル通信を行う
(その4)
シリアルポートで受信したデータを、データ受信イベントで検知して受信データをシリアルポートの受信バッファから読み込みます。
データ受信イベントは、SerialPortクラスのプロパティReceivedBytesThresholdでイベントが発生する受信バイト数が設定できます。
(ReceivedBytesThresholdのデフォルト値は「1」です。ReceivedBytesThresholdを変更すると、データ受信イベントの発生頻度を抑止できますが、ReceivedBytesThresholdで設定したバイト数未満の受信データしかないときには、当然データ受信イベントが発生しないので、受信データを取りこぼさない仕組みを考える必要があります。)
受信したデータは「受信データ」テキストボックスに表示中の文字列の最後に追加するようにします。
データ受信イベントは、ダイアログのスレッドとは別のスレッドから呼び出されますので、Invoke()を使用してスレッドを切り替えてテキストボックスに書き込みます。
サンプルコードを以下に示します。
'****************************************************************************'
'*
'* @brief データ受信が発生したときのイベント処理.
'*
'* @param [in] sender イベントの送信元のオブジェクト.
'* @param [in] e イベント情報.
'*
'* @retval なし.
'*
Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
'シリアルポートをオープンしていない場合、処理を行わない.
If SerialPort1.IsOpen = False Then
Return
End If
Try
'受信データを読み込む.
Dim data As String
data = SerialPort1.ReadExisting()
'受信したデータをテキストボックスに書き込む.
Dim args(0) As Object
args(0) = data
Invoke( New Delegate_RcvDataToTextBox( AddressOf Me.RcvDataToTextBox ), args )
Catch ex As Exception
MsgBox( ex.Message )
End Try
End Sub
SerialPortクラスのReadExisting()メソッドを呼び出してシリアルポートから文字列を受信します。
Public Function ReadExisting As String
戻り値として、シリアルポートの受信バッファに格納されていて、取り出し可能な文字列を返します。
サンプルプログラムでは、文字列の受信なので、ReadExisting()メソッドを利用しましたが、バイナリデータを受信する場合、Read()メソッドを利用します。
Public Function Read( buffer As Byte(), offset As Integer, count As Integer ) As Integer
引数 | 説明 |
---|---|
buffer | 受信データを格納するバイト型の配列。 |
offset | 受信データの格納を開始する配列の位置。 |
count | 受信データを読み込むバイト数。 |
戻り値として、取り出したバイト数を返します。
受信データを格納する配列(buffer)はアプリケーション側で確保します。
当然のことですが、offset + count が確保した配列のサイズを超えないようにします。
サンプルプログラムのソースコードを以下からダウンロードできます。
開発環境 | Visual Studio 2005 |
---|---|
開発言語 | VB2005 |
ファイル名 | sample_0008.zip |