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

概要

C#から.NET FrameworkのSerialPortコントロールを使用してシリアルポートからデータの送受信を行うサンプルコードです。

文字列の送受信を行います。

SerialPortクラスの使い方はVB.NETでシリアル通信を行うときと同じです。

サンプルプログラムの仕様

作成するサンプルプログラムは以下の仕様にします。

  • ウインドウ・スタイルはダイアログにする。
  • シリアルポートはユーザーが選択できる。
  • ボーレートは、4800bps/9600bps/19200bps/115200bpsからユーザーが選択できる。
  • フロー制御をユーザーが選択できる。
  • その他の通信設定は固定値とする。
  • [接続]ボタンを押すとシリアルポートをオープンし、ボタン表示を[切断]にする。
  • [切断]ボタンを押すとシリアルポートをクローズし、ボタン表示を[接続]にする。
  • [送信]ボタンを押すと、送信データのテキストボックスから送信する文字列を取得してシリアルポートに送信する。
  • シリアルポートから受信したデータは、受信データのテキストボックスに追記する。

サンプルプログラムの外観は以下のようにします。

プロパティとメソッド

SerialPortクラスの主なメソッドとプロパティは以下のとおりです。

クラス名System.IO.Ports.SerialPort
基本型

Component

メソッド名説明
GetPortNames

利用可能なシリアルポート名の配列を取得します。

Open

シリアルポートを接続します。

Close

接続中のシリアルポートを切断します。

Read

シリアルポートの受信バッファから受信データを読み込みます。

ReadByte

受信バッファから、受信データを1バイト読み込みます。

ReadChar

受信バッファから、受信データを1文字読み込みます。

ReadExisting

データ受信待ちをせずに、現在受信バッファにある読込み可能なデータを読み込みます。

ReadLine

受信バッファから1行分(改行コードまで)の文字列を読み込みます。

ReadTo

受信バッファから指定した値までの文字列を読み込みます。

Write

シリアルポートの送信バッファに送信データを書き込みます。

WriteLine

文字列と改行コード(NewLine値)を送信バッファに書き込みます。

プロパティ名説明
PortName

オープンするシリアルポートの名称を設定します。

BaudRate

通信速度(ボーレート)を設定します。

DataBits

1バイトのデータビット数を設定します。

Parity

パリティビットを設定します。

StopBits

ストップビットを設定します。

Handshake

フロー制御を設定します。

Encoding

送信する文字列の文字コードを設定します。

NewLine

改行コードを設定します。

ReadBufferSize

受信バッファのサイズを設定します。

WriteBufferSize

送信バッファのサイズを設定します。

ReceivedBytesThreshold

データ受信イベントが発生する、受信バッファのバイト数を設定します。

ReadTimeout

受信待ちタイムアウトを設定します。(ms単位)

WriteTimeout

送信完了タイムアウトを設定します。(ms単位)

BreakState

ブレーク シグナルを設定します。

DiscardNull

受信した null バイトを無視するかどうかを設定します。

ParityReplace

パリティエラーの発生したデータを置き換えるデータを設定します。

IsOpen

シリアルポートがオープンしているかどうかを調べます。

BytesToRead

受信バッファ内にある受信データのバイト数を取得します。

BytesToWrite

送信バッファ内にある未送信データのバイト数を取得します。

RtsEnable

RTS(Request To Send)信号を設定します。

DtrEnable

DTR(Data Terminal Ready)信号を設定します。

DsrHolding

DSR(Data Set Ready) シグナルの状態を取得します。

CtsHolding

CTS(Clear To Send)信号の状態を取得します。

CDHolding

CD(キャリア検出)信号の状態を取得します。

イベント名説明
DataReceived

シリアルポートでデータ受信が発生したときのイベントを処理するメソッド。

ErrorReceived

シリアルポートで受信エラーが発生したときのイベントを処理するメソッド。

PinChanged

シリアルポートの信号線の状態が変化したときのイベントを処理するメソッド。

ダイアログの初期処理

ダイアログのLoad()メソッドでダイアログの初期処理を行います。

ダイアログの初期処理では、シリアルポート名と通信設定値のコンボボックスを作成します。

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


/****************************************************************************/
/*!
 *  @brief  ダイアログの初期処理.
 *
 *  @param  [in]    sender  イベントの送信元のオブジェクト.
 *  @param  [in]    e       イベント情報.
 *
 *  @retval なし.
 */
private void Form1_Load(object sender, EventArgs e)
{
    //! 利用可能なシリアルポート名の配列を取得する.
    string[] PortList = SerialPort.GetPortNames();

    cmbPortName.Items.Clear();

    //! シリアルポート名をコンボボックスにセットする.
    foreach( string PortName in PortList ){
        cmbPortName.Items.Add( PortName );
    }
    if( cmbPortName.Items.Count > 0 ){
        cmbPortName.SelectedIndex = 0;
    }

    cmbBaudRate.Items.Clear();

    // ボーレート選択コンボボックスに選択項目をセットする.
    BuadRateItem baud;
    baud          = new BuadRateItem();
    baud.NAME     = "4800bps";
    baud.BAUDRATE = 4800;
    cmbBaudRate.Items.Add( baud );

    baud          = new BuadRateItem();
    baud.NAME     = "9600bps";
    baud.BAUDRATE = 9600;
    cmbBaudRate.Items.Add( baud );

    baud          = new BuadRateItem();
    baud.NAME     = "19200bps";
    baud.BAUDRATE = 19200;
    cmbBaudRate.Items.Add( baud );

    baud          = new BuadRateItem();
    baud.NAME     = "115200bps";
    baud.BAUDRATE = 115200;
    cmbBaudRate.Items.Add( baud );
    cmbBaudRate.SelectedIndex = 1;

    cmbHandShake.Items.Clear();

    // フロー制御選択コンボボックスに選択項目をセットする.
    HandShakeItem ctrl;
    ctrl           = new HandShakeItem();
    ctrl.NAME      = "なし";
    ctrl.HANDSHAKE = Handshake.None;
    cmbHandShake.Items.Add( ctrl );

    ctrl           = new HandShakeItem();
    ctrl.NAME      = "XON/XOFF制御";
    ctrl.HANDSHAKE = Handshake.XOnXOff;
    cmbHandShake.Items.Add( ctrl );

    ctrl           = new HandShakeItem();
    ctrl.NAME      = "RTS/CTS制御";
    ctrl.HANDSHAKE = Handshake.RequestToSend;
    cmbHandShake.Items.Add( ctrl );

    ctrl           = new HandShakeItem();
    ctrl.NAME      = "XON/XOFF + RTS/CTS制御";
    ctrl.HANDSHAKE = Handshake.RequestToSendXOnXOff;
    cmbHandShake.Items.Add( ctrl );
    cmbHandShake.SelectedIndex = 0;

    // 送受信用のテキストボックスをクリアする.
    sndTextBox.Clear();
    rcvTextBox.Clear();
}
	

利用可能なシリアルポート名をリストアップする

使用するシリアルポートをユーザーが選択できるように、利用可能なシリアルポートの名称をSerialPortクラスのGetPortNamesメソッドを利用してコンボボックスにリストアップします。


    public static string[] GetPortNames()
	

戻り値として利用可能なシリアルポート名のString型の配列を取得します。

設定可能な通信設定としてボーレートとフロー制御のコンボボックスを作成します。



商標に関する表示