C# を利用したシリアル通信
NET Framework 2.0 から標準サポートされたシリアルポートのコンポーネントをC#で利用するためのサンプルです。

サンプルコード download (C#)
動作には .NET Framework 2.0 のインストールが必要。
利用手順の要点は下記の通りです。詳細はサンプルコードを参照してください。
1. ツールボックスから SerialPort を選択し、フォームへドラッグする。

2. シリアルポートのオープン処理を記述する。
3. シリアルポートのクローズ処理を記述する
4. データ送信コードを記述する
5. データ受信コードを記述する
シリアルポートからの受信はフォームの描画処理とは別スレッドで実行される。そこで、意図通り動作させるために delegateを利用して Form側のスレッドで処理させるようにする。
なお、有効なシリアルポート名一覧は、
で取得できます。
参考
Microsoft: シリアル通信機能 (VB 2005利用)
浅草ギ研: Visual C# 2005 のシリアル通信機能を使ってみる

利用手順の要点は下記の通りです。詳細はサンプルコードを参照してください。
1. ツールボックスから SerialPort を選択し、フォームへドラッグする。

2. シリアルポートのオープン処理を記述する。
private void buttonCOMOpen_Click(object sender, EventArgs e)
{
try
{
if (serialPort1.IsOpen)
{
MessageBox.Show(this.textBox1.Text + " はすでに開かれています。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
// ポート番号文字列=this.textBox1.Text, 115200bps/N81/ハードウェアフロー/UTF8/改行=CR
this.serialPort1.PortName = this.textBox1.Text;
this.serialPort1.BaudRate = 115200;
this.serialPort1.Parity = System.IO.Ports.Parity.None;
this.serialPort1.DataBits = 8;
this.serialPort1.StopBits = System.IO.Ports.StopBits.One;
this.serialPort1.Handshake = System.IO.Ports.Handshake.RequestToSend;
this.serialPort1.Encoding = Encoding.UTF8;
this.serialPort1.NewLine = "\r";
serialPort1.Open();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
{
try
{
if (serialPort1.IsOpen)
{
MessageBox.Show(this.textBox1.Text + " はすでに開かれています。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
// ポート番号文字列=this.textBox1.Text, 115200bps/N81/ハードウェアフロー/UTF8/改行=CR
this.serialPort1.PortName = this.textBox1.Text;
this.serialPort1.BaudRate = 115200;
this.serialPort1.Parity = System.IO.Ports.Parity.None;
this.serialPort1.DataBits = 8;
this.serialPort1.StopBits = System.IO.Ports.StopBits.One;
this.serialPort1.Handshake = System.IO.Ports.Handshake.RequestToSend;
this.serialPort1.Encoding = Encoding.UTF8;
this.serialPort1.NewLine = "\r";
serialPort1.Open();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
3. シリアルポートのクローズ処理を記述する
if (serialPort1.IsOpen)
{
serialPort1.Close();
}
{
serialPort1.Close();
}
4. データ送信コードを記述する
private void SendString(string text)
{
try
{
this.serialPort1.Write(text);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
{
try
{
this.serialPort1.Write(text);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
5. データ受信コードを記述する
シリアルポートからの受信はフォームの描画処理とは別スレッドで実行される。そこで、意図通り動作させるために delegateを利用して Form側のスレッドで処理させるようにする。
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
// 受信文字列の取得
string receivedData;
try{
receivedData = this.serialPort1.ReadExisting();
receivedData = receivedData.Replace(this.serialPort1.NewLine, "\r\n");
}catch(Exception ex){
receivedData = ex.Message;
}
// richTextBox側のスレッドに AddRecievedDataメソッドのポインタを渡して、
// 受信文字列を追加させる
AddRecievedDataDelegate add = new AddRecievedDataDelegate(AddRecievedData);
this.richTextBox1.Invoke(add, receivedData);
}
private delegate void AddRecievedDataDelegate(string data);
private void AddRecievedData(string data)
{
this.richTextBox1.Text += data;
}
{
// 受信文字列の取得
string receivedData;
try{
receivedData = this.serialPort1.ReadExisting();
receivedData = receivedData.Replace(this.serialPort1.NewLine, "\r\n");
}catch(Exception ex){
receivedData = ex.Message;
}
// richTextBox側のスレッドに AddRecievedDataメソッドのポインタを渡して、
// 受信文字列を追加させる
AddRecievedDataDelegate add = new AddRecievedDataDelegate(AddRecievedData);
this.richTextBox1.Invoke(add, receivedData);
}
private delegate void AddRecievedDataDelegate(string data);
private void AddRecievedData(string data)
{
this.richTextBox1.Text += data;
}
なお、有効なシリアルポート名一覧は、
string[] ports = System.IO.Ports.SerialPort.GetPortNames();
で取得できます。
Microsoft: シリアル通信機能 (VB 2005利用)
浅草ギ研: Visual C# 2005 のシリアル通信機能を使ってみる
コメント
コメントする
この記事のトラックバックURL
http://tmp.junkbox.info/tb.php/14
トラックバック
TOP PAGE △