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型の配列を取得します。
設定可能な通信設定としてボーレートとフロー制御のコンボボックスを作成します。