【C#】シリアル通信(RS-232C)

スポンサーリンク

今回は機器と機器が通信する為の方法の1つとして、シリアル通信を紹介します。

シリアル通信とは

初心者向けにざっくり言うと、パソコンと対象の機器が会話する為の通信規格です。

ソフト側の人間は、オーソドックスな通信の為、クラスが準備されています。

その為、詳細を知る必要は、あまりありません。

シリアル通信には、3種類あります。

  1. RS-232C
  2. RS-422A
  3. RS-485

今回は、オーソドックスな【RS-232C】についてです。

接続について(構成について)

ノートパソコンに付いているのを見た事がありませんが、

D-Sub9Pinがシリアル通信のポートになります。

PC99規格に準拠していれば、緑色のコネクタです。

※PC99規格とは、インテル社とマイクロソフト社が共同作成した規格 (簡単に言うとコネクタの色を決めた)

  

ケーブルには3種類あります。

どれを接続するかは、通信したい機器のタイプに応じて変える必要があります。

使い分けの簡単な考え方は、

パソコンとパソコンでシリアル通信をしたい場合は、クロスケーブル
パソコンとセンサーでシリアル通信をしたい場合は、ストレートケーブル

でいいと思います。

※LANケーブルでも同じ考えです(ギガビット・イーサネット[GbE]だと気にする必要なし)

少し細かい話をすると、通信機器は2種類に分かれます。

DCE(Data Communication Equipment):
モデムやプリンタ、プロッタのように受動的に動作する装置

DTE(Data Terminal Equipment):
パソコンのように能動的に動作する装置

DTE同士の通信の時は、クロスケーブルになります。

ただ最近は、USBケーブルで通信するパタンが増えてきた気がします。

シリアルポートの確認

シリアル通信をする場合、COMポートを確認する必要があります。

確認方法は下記の通り。(デバイスマネージャーの開き方 Windouw10の場合)

デバイスマネージャーを開くと、【ポート(COMとLPT)】という項目があります。

それをさらに開くと、【***(COM*)】と表示されています。

これが現在パソコンが認識しているCOMポートとなります。

『COMポートを見つけている=シリアル通信ができる』

と思ってもらっていいと思います。

また、COMの番号は後々使うので、覚えておきましょう。

シリアル通信の設定

シリアル通信の処理を日常生活に例えるなら、

外にいる友達と話すために、
家の窓(COM)を開けて、会話(通信)して、会話が終われが窓(COM)を閉じるです。

シリアル通信をする為には、通信する為に設定をする必要があります。

この設定は、会話する為に相手に合わせないといけません。

  1. ボーレート(通信速度) ⇒ 話すスピード
  2. データ長 ⇒ 1回に話す長さ
  3. ストップビット ⇒ 会話の終わり方
  4. パリティ ⇒ 失言防止
  5. フロー制御 ⇒ 会話方法

対象機器の設定を調べる

まずシリアル通信ができる機器を探しましょう!!

まぁ身近に見つかるモノではありませんが。。。笑

通信機器が見つかれば、その機器の取扱説明書(マニュアル)を確認してください。

もしくは、テクニカルマニュアルを確認してみましょう。

すると、下記記載があります。

機器のシリアル通信の為の設定が分かりましたので、

ソフトを作っていきましょう。

通信開始/終了(COMOpen & COMClose)

まずは、適当にGUIを作ります。

窓(COM)の開閉を作ります。

初めにオープン処理

using System.IO.Ports;

//定義+インスタンス生成
SerialPort SrlPrt= new SerialPort();

private void Open_ComPort(string com)
{
  SrlPrt.BaudRate = 9600;
  SrlPrt.Parity = Parity.None;
  SrlPrt.DataBits = 8;
  SrlPrt.StopBits = StopBits.One;
  SrlPrt.Handshake = Handshake.None;
  SrlPrt.PortName = com;
  SrlPrt.Open();
}

これだと、連続でポートを開けた(オープン)際に例外になります。

「ポートが開いているのに、さらに開ける事はできませ~ん」ってエラーです。

その為、条件を追加します。

private void Open_ComPort(string com)
{
  if (SrlPrt.IsOpen == false)
  {
    SrlPrt.BaudRate = 9600;
    SrlPrt.Parity = Parity.None;
    SrlPrt.DataBits = 8;
    SrlPrt.StopBits = StopBits.One;
    SrlPrt.Handshake = Handshake.None;
    SrlPrt.PortName = com;
    SrlPrt.Open();
  }
}

次に閉じる処理です。これは簡単です。

private void Close_Comport()
{
  SrlPrt.Close();
}

送信

では、会話(通信)をしましょう。まずは発言(送信)しましょう!!

private void Send_Command(string cmd)
{
  SrlPrt.Write(cmd + "\r\n");
}

COMポートが開いていない状態で送信すると、

例外が発生します。

その為、先ほどと同様にCOMOpenしているか確認を入れましょう。

private void Send_Command(string cmd)
{
  if (SrlPrt.IsOpen == true)
  {
    SrlPrt.Write(cmd + "\r\n");
  }
  else
  {
    MessageBox.Show("COMOpenしてください。");
  }
}

もう一つ、今回最後の文字として”\r\n”を入れていますが、

これは、デリミタ文字といい、コマンドの最後につける文字です。

これも通信する機器のマニュアルに書いてあるので確認しましょう。

今回だと上記のような記載がありました。

受信

発信(送信)をしたので、相手の話を聞きましょう(受信)。

自分は確実性を持つために、

1バイトずつ受信して、デリミタ文字を待つようなロジックを作りますが、

今回は、簡単な方法で受信したいと思います。

private void Recieve_Command(out string rcv)
{
  rcv = SrlPrt.ReadLine();
}

送信と同じように、COMPortがOpenではないと、例外が発生します。

同じようにCOMOpenの確認を入れましょう。

private void Recieve_Command(out string rcv)
{
  if (SrlPrt.IsOpen == true)
  {
    rcv = SrlPrt.ReadLine();
  }
  else
  {
    rcv = "";
    MessageBox.Show("COMOpenしてください。");
  }
}

では、受信できているか確認しましょう。

受信の関数後にブレークを置いて、tmpにマウスをあてると、tmpの値を確認できます。

何かしら文字が入ってきており、受信できていそうですね。

まとめ

今回は、シリアル通信(RS232C)をしてみました。

今回作ったアプリケーションのGUIは、こんな感じになりました。

もう少し改善の余地はありますが、基礎という意味ではいいと思います。

受信のデリミタを削除(Trim関数を使えばいいだけなのですが)したり、

受信のロジックをデリミタ待ちにして、タイムアウトを作ったり。。。

作成するだけなら、ある程度のレベルまで来るとできるようになります。

バグを作らないためのロジックだったり、

例外処理の対処方法だったり、

使い手側の操作性の改善だったりと、

やるべき事は沢山あるので、少しずつステップアップしていきましょう。

コメント

タイトルとURLをコピーしました