C#でシリアル通信を行う
(その4)

シリアルポートからデータを受信する

シリアルポートで受信したデータを、データ受信イベントで検知して受信データをシリアルポートの受信バッファから読み込みます。

データ受信イベントは、SerialPortクラスのプロパティReceivedBytesThresholdでイベントが発生する受信バイト数が設定できます。
(ReceivedBytesThresholdのデフォルト値は「1」です。ReceivedBytesThresholdを変更すると、データ受信イベントの発生頻度を抑止できますが、ReceivedBytesThresholdで設定したバイト数未満の受信データしかないときには、当然データ受信イベントが発生しないので、受信データを取りこぼさない仕組みを考える必要があります。)

受信したデータは「受信データ」テキストボックスに表示中の文字列の最後に追加するようにします。

データ受信イベントは、ダイアログのスレッドとは別のスレッドから呼び出されますので、Invoke()を使用してスレッドを切り替えてテキストボックスに書き込みます。

サンプルコードを以下に示します。


/****************************************************************************/
/*!
 *  @brief  データ受信が発生したときのイベント処理.
 *
 *  @param  [in]    sender  イベントの送信元のオブジェクト.
 *  @param  [in]    e       イベント情報.
 *
 *  @retval なし.
 */
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
    //! シリアルポートをオープンしていない場合、処理を行わない.
    if( serialPort1.IsOpen == false ){
        return;
    }

    try {
        //! 受信データを読み込む.
        string data = serialPort1.ReadExisting();

        //! 受信したデータをテキストボックスに書き込む.
        Invoke( new Delegate_RcvDataToTextBox( RcvDataToTextBox ), new Object[] {data} );
    }
    catch ( Exception ex ){
        MessageBox.Show( ex.Message );
    }
}
    

シリアルポートから文字列を受信する

SerialPortクラスのReadExisting()メソッドを呼び出してシリアルポートから文字列を受信します。


    public string ReadExisting()
	

戻り値として、シリアルポートの受信バッファに格納されていて、取り出し可能な文字列を返します。

サンプルプログラムでは、文字列の受信なので、ReadExisting()メソッドを利用しましたが、バイナリデータを受信する場合、Read()メソッドを利用します。


    public int Read( byte[] buffer, int offset, int count )
	

引数説明
buffer

受信データを格納するバイト型の配列。

offset

受信データの格納を開始する配列の位置。

count

受信データを読み込むバイト数。

戻り値として、取り出したバイト数を返します。

受信データを格納する配列(buffer)はアプリケーション側で確保します。
当然のことですが、offset + count が確保した配列のサイズを超えないようにします。

サンプルプログラムのダウンロード

サンプルプログラムのソースコードを以下からダウンロードできます。

開発環境 開発言語 ファイル名
Visual Studio 2005 C# sample_0007.zip



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