中堅プログラマーの備忘録

忘れっぽくなってきたので備忘録として・・・

【C#.net】SerialPortクラスを使ってRS232C通信を行う

1.概要

最近のPCには標準で搭載されていないことが多くなってきましたが
外部デバイスの制御にはRS232C通信がまだ根強く残っており
アプリケーションから制御、または状態監視を行ったりと
インターフェースとしてまだまだ現役です。
今回はSerialPortクラスを使って簡単に232C通信を行います。

2.SerialPortクラスを使う

【Visual Studio】で任意のプロジェクトを作成し
【ツールボックス】にある【SerialPort】を選択し
Formに【ドラッグ&ドロップ】します。

f:id:tsu--kun:20190823095318p:plain

準備はこれだけで後はスクリプトを記述します。

3.使用可能なポートを取得する

RS232C通信を行うためにはPCにデバイスが備わっていないと使用できません。
これについては【デバイスマネージャー】から確認します。

f:id:tsu--kun:20190823095329p:plain

上図のとおり【ポート(COMとLPT)】にデバイスが存在すれば
RS232C通信が行うことが出来ます。

スクリプトから使用可能なポートを取得するのは下記のとおりです。

using System.IO.Ports;

string[] ports = SerialPort.GetPortNames();

4.ポートの設定を行う

RS232C通信を行うためにはシリアルポートの設定を行う必要があります。
今回は下記のとおり設定しました。

serialPort1.PortName = "COM3";// ポート名
serialPort1.BaudRate = 9600;// ボーレート(通信速度bps)
serialPort1.DataBits = 8;// データビット数
serialPort1.StopBits = System.IO.Ports.StopBits.One;// ストップビットは1bit
serialPort1.Parity = System.IO.Ports.Parity.None;// パリティはなし

通信速度はデバイスによって変わりますが
一般的には上記の設定が多いかと思います。

5.スクリプト

今回はデリミタありの場合を想定しています。
デリミタとはこの場合データの終端につける文字で
CR,LR,CRLFが一般的です。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace RS232Ctest
{
    public partial class Form1 : Form
    {
        string[] ports;
        string DELIMITER = "\n";
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            ports = SerialPort.GetPortNames();
            serialPort1.PortName = ports[0];
            serialPort1.BaudRate = 9600;
            serialPort1.DataBits = 8;
            serialPort1.StopBits = System.IO.Ports.StopBits.One;
            serialPort1.Parity = System.IO.Ports.Parity.None;
            try
            {
                if (serialPort1.IsOpen == true)
                {
                    return;
                }
                serialPort1.Open();
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

            if (serialPort1.IsOpen == true)
            {
                serialPort1.NewLine = DELIMITER;
                try
                {
                    serialPort1.WriteLine("sousin");
                }
                catch(Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }

        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            string strDataReceived = "";
            try
            {
                strDataReceived = serialPort1.ReadLine();
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

            if(serialPort1.IsOpen == true)
            {
                serialPort1.Close();
                MessageBox.Show(strDataReceived);
            }
        }
    }
}

6.実行する

アプリケーションを起動したら、【sousin】という文字列を送ります。
これに対して帰ってきた文字列をメッセージボックスに表示するという動作になっています。
相手側は【Serister】を使いました。

結果は下図のとおりです。
【Serister】に【s o u s i n [LF] 】が送られ
f:id:tsu--kun:20190823095342p:plain


【Serister】からの【test\x0a】をしっかり受信しています。
f:id:tsu--kun:20190823095400p:plain