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