1.概要
最近のPCには標準で搭載されていないことが多くなってきましたが
外部デバイスの制御にはRS232C通信がまだ根強く残っており
アプリケーションから制御、または状態監視を行ったりと
インターフェースとしてまだまだ現役です。
今回はSerialPortクラスを使って簡単に232C通信を行います。
2.SerialPortクラスを使う
【Visual Studio】で任意のプロジェクトを作成し
【ツールボックス】にある【SerialPort】を選択し
Formに【ドラッグ&ドロップ】します。
準備はこれだけで後はスクリプトを記述します。
3.使用可能なポートを取得する
RS232C通信を行うためにはPCにデバイスが備わっていないと使用できません。
これについては【デバイスマネージャー】から確認します。
上図のとおり【ポート(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] 】が送られ
【Serister】からの【test\x0a】をしっかり受信しています。