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 |