シリアル通信の応用
RS232Cは使いやすさから、長く使われている仕様です。使いやすさを優先させていることと、登場したのがずいぶん古いということもあり、あくまで、一対一の通信となっています。シリアル通信規格で一対多の仕様もできています。前にも出したRS485の規格は32台まで芋づる式につなぐことができます。
セキュリティもありません。特別なエラー制御もありません。プログラムでかってにやってくれという仕様です。これらは計測制御の場面で1つの問題でもあります(通信エラー処理を考えた通信仕様をプログラム側で考えなければいけません)。時期を同じくして、GPIBというしっかりした通信規格が出てきました。この規格は一対多をサポートしています。この規格も計測機器の世界ではまだ幅を利かせています。
現在は、皆さんご存知のLAN通信が主流になりつつあります。インターネットが整備されていることで、LANを使うと遠くに離れた(人が行けない場所など)計測機器の制御やデータ収集ができます。ただ一般的に利用できるようにしているため、仕様がとても複雑です。LAN通信の仕様に合わせて、すべてのルーチンを自前で作成するのは、大変な作業になります。
そんなこともあり、このRS232C規格はまだまだ現役で活躍しています。しかし「遠くにあるRS232C規格の制御機器を動かしたい」という要望は強く出て来ています。そこで、現在では「RS232C⇔LANプロトコル変換器」なるものが出て来ました。制御機器側は今までどうりRS232Cで作成し、LANプロトコル変換器でインターネットを通じてパソコンや他の制御機器とたやすくつなぐことができるようになりました。
例えば、農家のビニールハウスは温度管理はとても大変です。ハウスの中の温度が上がると、ハウスの一部を開けて冷やしてやらねばいけません。ある温度でビニールハウスの開け閉めの制御を行うのはワンボードマイコンが使用されています。農家の人たちが家の中で、パソコンで設定をしたり、異常時に携帯に知らせてくれたりするシステムが在ると、対応がスムーズに出来て管理もしやすくなると思います。ここで、「RS232C⇔LANプロトコル変換器」の出番です。ワンボードマイコンはRS232Cで通信をし、変換器でインターネットにつなげれば、携帯にメールすることもできます(メールをするときはサーバーが必要になります)。
送り方のバリエーション
今回は1行まとめて送りましたが、1文字ずつ送る場合や、区切り文字を特別に設定したいときなど、もう少し工夫が必要になります。
今回のサンプルで、もし抽選データを送る側のパソコンが動かなくなったときは、表示用パソコンは永遠に待つことになります。このようなときのために受信のみをまとめて1つのサブルーチンにして、ある一定時間受信がないときでもメインルーチンへエラーで戻すようにします。このエラーをタイムアウトエラーと言います。
以下、今回のサンプルソフトの受け取り側をタイムアウト付きの処理にしたものです
画像表示は組み込んでいません。
//Form1_Loadで0セット Form1_FormClosedで1セット int endf; //ボタンとサブルーチンで使用するため ここに宣言 SerialPort port; private void button1_Click(object sender, EventArgs e) { //RS232C OPEN port = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One); port.DtrEnable = true; port.RtsEnable = true; port.Open(); port.DiscardInBuffer(); //バッファクリア this.label1.Text = "待ち"; while (true) { Application.DoEvents(); if (endf == 1) break; //ここでサブルーチンを呼ぶ //一定時間受信がなくても戻る //戻り値は"Time Out" this.label1.Text = rs_inp(); } port.Close(); } //**************** //読み込みサブルーチン //**************** private string rs_inp() { string s; int c; //タイムアウト用 //取り込みエリア 今回1文字 Byte[] data=new Byte[1]; s = ""; c = 0; data[0] = 0x00; //dataエリアクリア while (true) { c++; if (c > 200000) //テストしたパソコンで10秒くらい { s = "Time Out"; break; } Application.DoEvents(); if (endf == 1) break; if (port.BytesToRead != 0) { c = 0; //タイムアウトカウントクリア port.Read(data, 0, 1); //1文字ずつ読み込み if (data[0] == '\n') break; //送るとき\nを最後につけているので、 //\nで行の終了を確認する s = s +System.Convert.ToChar(data[0]); } } port.DiscardInBuffer(); //バッファクリア return s; }
読み込みサブルーチンrs_inpを作成しました。戻り値は10秒間隔で受信があれば受信データを、なければTime Outの文字を返すようにしています。
通信処理内で止まってしまうとプログラム側で対処できなくなります(通称ハングアップ)。これを回避するため1文字ずつ読み込み、データが来ないときはタイムアウトエラーとして、メインに返すようにします。
まとめ
この規格はワンボードマイコンで手軽に通信処理プログラムを作ることができるので、パソコンと他の制御機器との通信に多く使用されています。今回はパソコン同士で通信する例題を作成しました。手軽にパソコン同士の通信ができ、会社の展示会で顧客の目を引いたり、イベント会場でオセロゲームで対戦させたり、いろいろな人のアイデアで楽しいひと時が過ごせるのではないかと思います。
パソコン単体でもゲームあり、動画ありで、面白いのですが、このようにパソコン同士をつなげて楽しむことが手軽にできるようになると、今まで硬いイメージしかなかったパソコンが、なんだか楽しい生き物に見えてくるのではないでしょうか。