C#のSerialPortクラスでシリアル通信を始める!初心者向け入門ガイド
生徒
「C#でパソコンと機械を繋いでデータ通信をするにはどうしたらいいですか?」
先生
「C#にはSerialPortという便利な機能があって、それを使うとシリアル通信ができるようになりますよ。」
生徒
「シリアル通信って何ですか?難しそうなんですけど……。」
先生
「大丈夫です!身近な例えを使いながら、ゼロから丁寧に解説していきますね。」
1. シリアル通信とSerialPortクラスとは?
まずは言葉の意味から整理しましょう。シリアル通信とは、データを一本の道に一列に並べて順番に送る通信方法のことです。例えるなら、狭い一本道を車が一台ずつ順番に通り抜けていくようなイメージです。これに対して、たくさんの道を並行して同時にデータを送る方法をパラレル通信と言いますが、現代ではこのシリアル通信が主流です。
C#でこの通信を行うために用意されているのがSerialPort(シリアルポート)クラスです。クラスというのは、プログラムにおける「道具箱」のようなものです。この道具箱の中には、データの送信や受信を行うための便利なツールが詰まっています。これを使うことで、センサーやArduinoといったハードウェアとの通信を簡単に実装できるようになります。
2. プログラミングを始めるための準備
C#でシリアル通信を行うには、開発環境であるVisual Studioが必要です。また、プログラムの先頭で「この機能を使いますよ」という宣言をする必要があります。これを名前空間(Namespace)のインポートと呼びます。シリアル通信を使うための呪文はusing System.IO.Ports;です。これがないと、コンピューターはシリアルポートの機能を認識できません。
次に、ポートの設定が必要です。通信には「COMポート番号」「通信速度(ボーレート)」などの約束事があります。相手の機械がどの設定で動いているかを正しく合わせることが、通信成功の秘訣です。この設定を間違えると、データが化けたり、全く通信できなかったりします。
3. シリアルポートを使ってデータを送信する
それでは、実際にデータを送るプログラムを書いてみましょう。Writeという命令を使うことで、接続した相手に文字を送ることができます。以下の例では、プログラムを開始してポートを開き、メッセージを送信しています。
using System;
using System.IO.Ports;
class Program
{
static void Main()
{
SerialPort port = new SerialPort("COM3", 9600);
port.Open();
port.Write("Hello World");
port.Close();
}
}
このコードでは、まずSerialPortという道具を準備し、次にOpenメソッドで道を開通させています。そしてWriteでデータを流し込み、最後にCloseで道を閉じています。Closeを忘れると、他のプログラムがそのポートを使えなくなるので、必ず閉じる癖をつけましょう。
4. シリアルポートからデータを受信する
今度は逆に、相手からのデータを受け取る方法です。これにはイベントという考え方を使います。イベントとは、「何かが起きたときに実行する処理」のことです。例えば、「データが届いた!」という出来事が発生した瞬間に、中身を読み取るという動きを作ります。これにはDataReceivedイベントを使用します。
using System;
using System.IO.Ports;
class Program
{
static void Main()
{
SerialPort port = new SerialPort("COM3", 9600);
port.DataReceived += Port_DataReceived;
port.Open();
Console.ReadLine();
port.Close();
}
private static void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string data = sp.ReadLine();
Console.WriteLine("受信データ: " + data);
}
}
ReadLineという命令は、改行記号が来るまでを一塊として読み取る便利なツールです。データが届くたびに自動的にこの処理が動くので、取りこぼしを防ぐことができます。初心者の方は、まずこの「届いたら反応する」という仕組みを覚えておくのが大切です。
5. 通信エラーを防ぐための例外処理
シリアル通信は、ケーブルが抜けたり、相手の電源が落ちたりといったトラブルがつきものです。そんなとき、プログラムが突然終了してしまわないようにするのが例外処理です。try-catchという構文を使うことで、「もし失敗しても、ここで受け止めて教えてね」という保険をかけることができます。
try
{
SerialPort port = new SerialPort("COM3", 9600);
port.Open();
port.WriteLine("Test");
port.Close();
}
catch (Exception ex)
{
Console.WriteLine("エラーが発生しました: " + ex.Message);
}
この書き方をすると、もしCOM3が見つからなかったとしても、エラーの内容を教えてくれるだけでプログラム全体は止まらずに済みます。これはハードウェアを扱う開発では非常に重要なテクニックです。特に、現場で動かすプログラムには欠かせない知識となります。
6. IoT開発におけるシリアル通信の活用
ここまで学んだシリアル通信は、現代のIoT(モノのインターネット)開発において、非常に重要な役割を果たしています。例えば、温度センサーから送られてくる数値データを受信して、それを画面にグラフで表示したり、クラウドに送信したりといった連携が可能です。また、パソコンからの操作でモーターを動かしてロボットを制御することもできます。
SerialPortクラスは、単なる通信手段ではなく、あなたのプログラムを現実世界のハードウェアと繋ぐための架け橋です。まずはLEDを光らせるような小さな実験から始めて、徐々に大きなシステムへと発展させていきましょう。基礎をしっかりとマスターすれば、どんな複雑なハードウェア制御にも応用できるようになります。プログラミングの第一歩として、ぜひシリアル通信の世界を楽しんでください。