C#外部機器との通信1 シリアル通信

2020年9月9日

この記事ではC#と外部機器とのシリアル通信について紹介します。

通信ポートの確認

シリアル通信ではwindowsと外部機器との接続に対してOSが自動的にポート番号が割り当てます。なのでwindowsが起動するたびにポート番号が変わってしまう可能性があります。通常はいちど割り当てられたポート番号を使い続けるようですが、通信ができなくなった場合はポート番号が変わっていないか確認をしてください。

割り振られたポート番号はwindowsのデバイスマネージャで確認できます。

デバイスマネージャ シリアル通信にCOM1が割り当てられている

シリアル通信

Visual C#のデザイナー画面で左にあるツールボックス>コンポーネントの中のSerialPortをフォームにドラッグアンドドロップします。ラベルとボタンも配置しておきます。

serialPort1が配置できたらserialPort1を選択し、画面右下のプロパティから必要な設定を行います。ここではBaudRateやParityが正しい値になっているか確認します。

ここではbutton1がクリックされたらシリアル通信を行うようにプログラムを作ります。

はじめにシリアル通信が使うポートの番号を以下のように設定します。

 serialPort1.PortName = "COM1";

次にシリアルポートをOpenしてPCと外部機器との通信を準備します。

serialPort1.Open();

ポートのOpenができたら、データの読み書きを行います。

serialPort1.Write("*IDN?");
string readData = serialPort1.ReadExisting();

外部機器へコマンドを送る場合は.Write()を使います。送った*IDN?は機器のIDを問い合わせるコマンドですが、これは接続されている機器によるので、機器のマニュアルに従ってください。機器ごとのコマンドについては改めて別の記事で紹介します。

外部機器から送られてくるデータは.ReadExisiting()で読み込み、readDataへ格納されます。

通信終了後にポートをCloseします。

serialPort1.Close();

上記が一連の通信の流れですが、途中で通信エラーがあるとプログラムが異常終了しますので、異常終了にならないようにtry文で囲みます。

serialPort1.PortName = "COM1";

try
{
    serialPort1.Open();
    serialPort1.Write("*IDN?");
    string readData = serialPort1.ReadExisting();
    serialPort1.Close();
}
catch
{
    MessageBox.Show("通信エラーが発生しました");
}

try文の途中でエラーが発生するとcatchの処理が行われます。例ではエラーが起こった場合はメッセージボックスでエラーを通知します。

実際の処理では外部機器は.Write()のコマンドを受けて処理を行い、結果を.ReadExisting()で返すので、この二つの処理の間に少しの時間が必要です。その場合は.Write()命令のしたにSleep()を入れるとうまく動作します。

try
{
    serialPort1.Open();
    serialPort1.Write("*IDN?");
    System.Threading.Thread.Sleep(100);
    string readData = serialPort1.ReadExisting();
    serialPort1.Close();
}
catch
{
    MessageBox.Show("A communication error has occurred");
}

例では100m秒待っていますが、これも外部機器によりますので、数字を変えて何回か試す必要があります。

3 プログラムの実行

シリアル通信のプログラムが書けたら実行します。インターフェースが複数ある外部機器では事前に通信ポートをシリアルポートに設定する必要があります。

通信がうまくいかない場合はserialPort1のプロパティの中のBaudRateやParityの値が正しい値になっているかを確認してください。

まとめ

この記事ではシリアル通信によって外部機器との通信を行う方法を紹介しました。外部機器の種類により通信設定が代わる場合があるので、特定の機器のプログラム方法を別の機会にまた紹介したいと思います。