はじめに
ネットワーク全盛時代に、「いまさら」のシリアル通信の説明です。
あまりにも複雑になって、中身はどうして動いているのか分からないけれど、動くから使っているという人たちが増えています。ネットワークは便利になった反面、パソコンをいじるのには興味があるが、なかなか手を出せないでいる人たちが多いのではないでしょうか?
パソコン1台だけでなく、2台のパソコン同士で会話をさせて何か作ってみたい、という願望を比較的簡単に実現させることができるものが、このシリアル通信です。現在のプログラム開発環境でもサポートされています。計測機器にもまだまだ使われています。
今回はサンプルソースをVisual Studio 2008(以降、VS2008と表記)、言語はC#で作成しました。Visual Studio 2003以前の.NETでシリアル通信関数は標準から外されていましたが、Visual Studio 2005からは標準に戻されたようです。
対象読者
「パソコンでプログラムを組んで見たい。」と勉強をはじめたばかりの方で、パソコン間の通信に興味を持たれている方。できればC#のプログラムを作成できる方を対象に考えています。
必要な環境
サンプルソースはVS2008で動作確認しています。
シリアル通信の概要
シリアル通信の規格は、RS232C、RS422、RS485と複数あります(有名でない規格はまだまだあります)。1本の線でデータが送れるのには変わりがありませんが、ケーブルの形も送り方もまったく違います。
シリアル通信のイメージをつかんでもらうため、このなかで比較的取り組みやすいRS232Cについての説明と、実際のプログラムの書き方を説明したいと思います。
シリアル通信のイメージ
シリアル通信のイメージは、糸電話にたとえることができます。一方は喋る人、もう一方は聴く人です。お互いに話したいときは2本の糸電話が必要です。ただし、同時に使用することはできません。
一方から「お元気ですか」と送ると、返事として「元気ですよ」と帰ってきます。一本の糸電話で「お元気ですか」の文字列が送られます。この通信方法をシリアル通信と言います。パソコンの場合、文字は1文字ずつ送ります。
相手のほうで受け取り準備をしてもらうため、「送りますよ」「1文字目」「終わりました」「送りますよ」「2文字目」「終わりました」…と1文字ごと、送り初めと終わりを知らせます。
通信文字の内容は、通信の仕様内では感知しないことになっています。送る文字の内容は送る側と受け取る側で独自に決めることができます。
こちらから送りたい相手への線は1本、相手からこちらへの線1本、それにアースの線の3本で通信できるということになります。アース線は、糸電話の時はお互いに立っている同じ土壌に相当します。
この3本線が一つのケーブルに入ってシリアルケーブルができあがっています。
シリアル通信の仕組み
1文字とは、ASCII文字(8ビット、半角英数文字)のことです。1文字送るために、「送りますよ」というビットが1ビット、終わりましたというビットが1か2ビット(開始時に指定します)必要になります。お互いのパソコンではこのビットを送る速さは同じでないといけません。
送るタイミングはプログラムに任せられているため、ハード的にはお互いに送る時タイミングを取り合うことはありません。そのため、この通信は非同期通信と呼ばれています。
もちろんプログラムではお互いタイミングを合わせた処理を作成する必要があります。
プログラムを作成するときは、まずはじめにお互いの通信命令を決めます。
例えば、Aパソコンから「HELLO」と送り、Bパソコンが受け取ったということを「HELLO」で返し、お互いに通信開始が確認できたので、Aパソコンの画面のボタンを人が押すと、Aパソコンから「GET」命令を送り、Bパソコンは現在の温度を測定して、温度を送り返すなど、のシステムを考えることができます。
通信命令を決めると、それぞれのパソコンは何をすべきかが決まってきます。その通信指令の手順に従ってプログラムを組んでいきます。