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



Windowsは米国Microsoft Corporationの登録商標です。