■ホビーロボット部品の製造・販売 
  モータコントローラ、センサ、音声、画像、無線モジュールなど、
■ホビーロボット制作記事のページ (各種マイコン、PCとの接続事例)
■特殊メイク、特殊材料の販売 ※特殊メイクのコーナーはこちらに移りました。
Top(お知らせ) 製品紹介 使い方とサンプルプログラム 通信販売 リンク ロボット掲示板 会社案内
 Easy Robotics for all enthusiastic people!!!  ---HOBBY ROBOT PARTS SHOP ASAKUSAGIKEN---   Since 2003...

Visual C# 2005 のシリアル通信機能を使ってみる
はじめに

 
前回はPC上でWindowsアプリケーションを作るのに使う、Visual C# 2005 Express Edition(以下VC#、又はC#と略す) をマイクロソフトのホームページから無償でダウンロードし、インストールしました。ここではVC#のシリアル通信について使い方を調べてみます。

 PCとロボット、つまりロボットに搭載されたマイコンを通信させる場合、たいていどちらにもある機能である「シリアル通信機能」を使うのがてっとり早いです。最近では、USB機能がついているマイコンも出始めていますが、やはり多くに備わっているのがこのシリアル通信機能でしょう。

 PCのシリアル通信機能はシリアルポート又はCOMポートとして多くのPCに搭載されていましたが、最近では転送速度がより速いUSBなどが標準になりつつあり、NOTE−PCなどではCOMポートがついていないものが増えてきました。PCアプリソフトの開発環境でも、COMポートは「レガシーデバイス」として扱われ、開発対象からはずされるような流れでした。
 しかし、最近の携帯機器や無線機器の発達により、COMポートを使用する用途が増え、VisualStudio2003(以下VS2003と略す)ではサポートしていなかったシリアル通信のライブラリ(マイクロソフト(以下MS)が用意したプログラム集がライブラリ)を今度のバージョンからはサポートするようになったということです。

ちなみに、浅草ギ研では、USB−シリアルコンバータを販売しており、USBしかないPCでもシリアル通信を行うことができます。


 ※このページで紹介する内容はあくまでも一例です。個別の作成のご相談ご質問はお答えできませんのでご了承下さい。このページと同じ内容についてのご質問についてはロボット掲示板にてお願いいたします。

 ※ここではビギナー向けに解説していますが、このページは、プログラミング技術の向上を狙っておりません。VC#に関する質問はご遠慮下さい。(他所で良いページがたくさんありますのでインターネットで調べてください。もしくは本を買って勉強してください。プログラム本は高いですが、図書館に申請すると無料で読めます。ついでにギ研の本も申請してもらうとありがたいです。)


VC#2005でシリアル通信プログラミング

 では早速、シリアル通信が標準装備になったというVC#2005でシリアル通信プログラムをどのようにして作るか確認してみましょう。

 とりあえず簡単なフォームを作ってみます。フォームは各Windowのことで、Windowsプログラムは基本的にフォーム単位でプログラムを作成します。「ファイル」−>「新しいプロジェクト」−>
Windowsアプリケーション」を選択し、プロジェクト名(今回は適当にCOMtest1とした)をつけて「OK」を押します。


Windowsアプリの場合は下のような画面になります。始めに立ち上げたときは右側がソリューションエクスプローラ(プロジェクト管理をするもの)で、右側に作成するWindwsフォームが表示されます。Windowsアプリ作成では「プロパティ」や「イベント」をいじって作り上げていきますのでとりあえずこれらを表示させます。


「表示」−>「プロパティウィンドウ」を選択します。


画面右下に「プロパティ」が追加されたかと思います。Form1をクリックするとそのプロパティが表示されます。


プロパティの値を変えるとフォームの設定も変わります(実際にはFORM型クラスプロパティを変えている)。Windowsアプリケーションを作ると初期の表示は「Form1」のようになっていますが、これを試しに変えてみます。
左の画面でForm1を選択し、プロパティのTextの中を「シリアル通信テスト」と書き換えてみます。


このように表示が変わります。(表示が変わっただけで、このフォームの名称はFrom1のままです。)

このままではなにもできないフォームですが、これにいろいろな部品、これをコンポーネントと言いますが、コンポーネントを貼り付けて機能を追加していきます。コンポーネントを貼り付けるには「ツールボックス」を使います。ツールボックスを表示するには、「表示」−>「ツールボックス」を選択するか、画面左(Formが表示されているよりさらに左の枠内のあたり)にマウスのカーソルを合わせます。


ツールボックス内の表示は項目ごとなど、表示の仕方をいろいろかえられますが、とりあえず「すべてのWindowsフォーム」というところを見ると現在使用できるコンポーネントの一覧がアイコン付で表示されます。
尚、これ以外にもコンポーネントがありますがツールボックスの中には入っていません。これら以外も使用した場合は「ツール」−>「ツールボックスのアイテム選択」で未使用のコンポーネントにチェックを入れると使えるようになります。 (ここではやりません。)

さて、標準となったシリアル通信コンポーネントを探してみます。コンポーネントの表示は標準ではアルファベット順になってます。シリアル通信、もしくはCOMポートなのでCかSを探すとSの方にありました。これをドラックしてForm1の上でドロップします。


Form1(ここではシリアル通信テストという表示のフォーム)の上でドロップしますが、フォームに表示されないコンポーネントは画面下の方にアイコンが貼り付けられます。(下の方)

このserialPort1をクリックすると、画面右下のプロパティが変わり、このコンポーネントのプロパティを表示します。

たとえばプロパティのBaudRateをクリックすると下の方に解説が出て、ボーレート(通信速度)を設定するプロパティだということがわかります。プログラム経験者であれば、直感的に 「プログラム中で BaudRate=19200 のようにすれば通信速度を設定できるんだな」 とわかるでしょう。


下はSerialPortコンポーネントの全プロパティです。結構少ないですがそれだけ簡単に通信を行えるというものです。
RH60-11

使用頻度順にならべてみました。

<通常通信そのものに関わるもの>
PortName COMxで表す(xは数値)。普通、デスクトップPCの裏についてるのはCOM1。NOTE−PCなどはCOM1がモデム専用だったりして、シリアル通信に使えるのはCOM3とか4だったりするので注意が必要。Windowsのデバイスマネージャで番号を確認できます。
BaudRate 9600bps(bit/second)で通信するものが多い。USBなどに比べると低速だが、マイコンなどは通常、1200,2400,9600,19200,38400bpsのように9600の倍数で通信するものが多い。マイコンでそれ以上の高速通信をする場合は正確なクロック(クリスタル)が必要だったりする。
Parity ハードの性能が上がり、通信エラーが非常に少ないので、現在の普通のシリアル通信ではパリティチェックはあまり使いません。よってNoneでよいでしょう。ちなみに、Noneのところをクリックすると他の設定も出ますが、odd:奇数パリティ、even:偶数パリティ、Mark:マーク状態、Spece:スペース状態、で判定します。(詳しくはRS232Cをキーに調べてください)
DataBits 通常のシリアル通信では8bit単位で通信されます。昔はアルファベットを送るのに7bitで送ったりしましたので設定できるようになっているのでしょう。8固定でお願いします。
StopBits 通信は8ビットの前後にスタートとストップを表すのに各1ビットづつ使います。ストップビットを1.5や2にすると、ストップビットがその分増えますが、最近のハードウェアは性能が良いのでストップビット1で問題なく、たいていのシステムはここを1で通信しています。よって1バイト送るには結局10ビット必要になります。1=oneです。
Handchake 昔は低速な機器と通信するのに、相手の通信準備ができているか、などを確認するために送受信ライン以外の線も使って「フロー制御」というものをやってました。これをハンドシェークとも言います。現在ではハードの性能が上がったのでフロー制御を行わないパターンが多いです。
これだけの設定で通信はできます。

<通信が切れたり相手がつながってないエラーを回避する場合>
ReadTimeout 受信途中で回線が切れた場合に何mS間あいたらエラーにするかを設定。−1だとタイムアウト無しのような感じ。(余裕があったらやってみます)普通はほとんどないが、ロボットの場合はバッテリ切れやケーブル断線などがよくあるので通信が切れる場合の考慮が必要。
WriteTimeout 同じく送信途中の場合。

<バッファ関連(PCで別な処理をしていてもとりあえず通信を送受信しておくメモリのようなものがバッファ)>
ReadBufferSize 受信時のバッファサイズ(バイト単位)。マイコンではシリアル通信のバッファは多くても数十バイト程度ですが、デフォルトで4096になってます。おそらくマイコンとの通信ではこんなに使いませんが、PCにしてみると微少なので変えなくてもよいかと。
WriteBufferSize 同じく送信時のバッファサイズ。

以下、あまり使わないものとその理由です。内容はそれぞれをクリックして見てください。AGB65との通信では以下は全部使いませんが、マイコンとの通信で微妙なことをやる場合は使うかも。

■DiscardNull:シリアルポートを抜き差しした場合の処理ですが、抜き差ししません。
■DtrEnable:フロー制御の細かい設定です。フロー制御しません。
■ParityReplace:大量通信(又はパケット)時の設定ですが、大量通信しません。
■ReceivedByteThreshold:イベントとの関連ですが、標準設定でよいような感じ。
■RtsEnable:フロー制御の細かい設定です。フロー制御しません。

Windowsアプリ作成にはプロパティのほかに「イベント」というものも重要です。プロパティはフォームの設定をする(ような感じ)のものですが、イベントは、なにかが起きたときに動くプログラムです。マイコンで言うところの「割り込み」のようなものです。
イベントも各コンポーネントに標準のものが付いておりますのでSerialPortコンポーネントのイベントを見てみます。

画面右下のプロパティの中にある、稲妻アイコンを押すとイベントが見れます。SerialPortには3つしかイベントがありませんでした。各機能はその名のとおりです。
RH60-12

ここで、なぜデータ送信時のイベントが無いのか疑問に思うかもしれませんが、データ送信するタイミングはPC側の都合で送るのでいつ送るかは自分でわかりますのでイベントは不要です。受信は、相手からいつデータがおくられてくるか事前にわからないのでイベントが必要です。

実際にデータを送信する場合は、別なコンポーネントのイベント、たとえばボタンコンポーネントの「ボタンを押したとき」に発生するイベント内に、送信プログラムを書いたりします。

これで、シリアル通信機能が実装できましたので、実際にどうやって送受信するか調べてみます。
C#で実際に動作をさせる部分を「メソッド」と言います。SerialPortのメソッドはプロパティだけではわかりませんので、ヘルプを参照します。

とりあえず、「ヘルプ」−>「検索」で、SerialPortというキーで検索してみました。



VC#2005からは、ヘルプはオンラインでも検索が行われ、常に最新の情報が見れるようになってます。海外のデータや、コミュニティの情報まで検索してくれるので非常によいです。
検索結果で、「SerialPortメンバ」というものがありました。メンバはそのコンポーネントを構成する要素をさしますので、ここを見るとSerialPortの一覧が見れることが推測されます。ということで押してみます。


すると、SerialPortのメンバの説明ページになります。構成は下のようになっていました。

詳しい内容については割愛しますのでC#本で勉強してください。以下概略を説明しますが、ビギナー向けに意訳してますのでご了承ください。

C#は正確にはクラスという単位でプログラムを作ります。クラスを作る場合には、クラスの動きを定義する(つまり仕様を決める感じ)部分と、定義したクラスを実際に実体化する部分からなります。定義と実体化が別なので、同じものを複数実体化することができ、たとえば「ボタンを定義して複数実態化して配列で扱う(for文などで沢山のボタンを作り、個別管理ができるなど)」、というようなことができます。
マイコンでCで書く場合は関数にすればよいので同じだと思うかもしれませんが、C#の場合は定義を抽象的に行えるので中身を知らなくても受け渡し部分だけ知っていればそのプログラム(クラス)を使えるようになっています。 Cの場合は関数を作った本人でないとその関数の使い方はわかりずらいということが多いでしょう。またその他にもクラスで扱うと、同じような感じだけとちょっと違うクラスを作るのも簡単に行えます。

メンバの構成要素の説明
■パブリックxx:ユーザーが普通に使える機能
■プロテクトxx:このクラス(上の場合はSeroalPortクラス)をベースに別なクラスを作るときに使う機能
■コンストラクタ:実態化するときに行う処理
■フィールド:そのクラス内にある変数、Cにおけるグローバル変数のようなもの。通常はクラスの状態変数などで使う
■プロパティ:主に外部からアクセスさせるための変数のようなもの。単なる変数ではなくプログラムも組み込むことができる。(値が変わったらなにかする、とか、数値の範囲を監視してオーバーしたらエラー出すとか)
■メソッド:実際に処理を行うもの。Cにおける関数のようなもの。
■イベント:Windowの場合は、「なにかがトリガとなってプログラムが実行される」というのが基本にあります。このトリガとなるものをイベントと言い、イベント内部に書いてあることが実行されます。マイコンの割り込みのようなもの。

パブリックプロパティと、パブリックイベントはC#の画面(上の写真RH60-11,12)で確認しました。今調べたいのはどうやって実際に送受信するかなので実際の処理が書かれていると思われる「パブリックメソッド」を見てみます。




ここで使いそうなのは Open、Close、Read、Write の4つでしょう。Windowsでは複数のプログラムを動かせるので、どのプログラムがシリアル通信ポートを使うかという処理も必要なのでOpenとCloseも重要です。
ではそれぞれの中身を見てみます。

<Openメソッド>

メソッドはCなどと使い方はほぼ同じです。C#のところを見ると void Open( ) となっているので、ポートをオープンするには単にOpen()とすればよいのがわかります。public修飾子はクラス外部で使えるという意味で、ユーザー側で普通に使えるという意味です。どのCOMポートをオープンするかは、プロパティにPortNameというのがあってそこにCOM1のように設定する感じだったので、このプロパティで開くCOMポートを指定してからOpen()とすると、このSerialPortクラスが実装されているフォームが、COMポート使用の優先権を取る処理がされる、というのが推測されます。
このページの下に書いてありますが、COMポートをオープンするのに時間がかかる場合があるのでClose()してからOpen()するのが良いようです。
上では、C#以外の構文も出てます。VisualBasicを使われている方も多いと思いますが、このようにコーディングが長くなります。VB6からVB2003又はVB2005に移行するのはC#に移行するのと労力は変わらないと聞いてます。
上の方に言語フィルタというのがありましたので、以下はC#だけ表示させてみます。

<Closeメソッド>

COMポートを閉じる場合も簡単にClose()でよいようです。

<Readメソッド>
先の検索結果のところでReadを押すと下の画面になります。

オーバーロードは、同じメソッド名で引数が違うものを複数用意することを言います(他の意味もある。Cではこうゆうのはできない)。上を見るとByte型とChar型の変数になってます。どちらも8ビット長で、受け取る値は数値に直すと同じですが、Windows的に文字で扱うか数値なのかを指定して受け取りもできるという感じです。CharはByteに、またその逆の変換も後でできるのであまりたいしたことではありません。
AGB65シリーズは数値で命令をやりとりするのでここではByte型を見てみましょう。

ということでバッファから読み取って配列に入れるようです。バッファから1バイト読み込むには Read(myBuffer,0,1) のような感じでしょうか。

<Writeメソッド>

Writeの場合はオーバーロードが3つありました。ここでもByte型で扱うところを参照してみます。

配列からバッファに書き込むようです

解説を読むとわかりますが、大量に通信する場合にハンドシェーク(フロー制御)のXonXoffが使えるようです。しかし、マイコン−PC間のシリアル通信でそんなに大量にやりとりすることは無いと思いますので、やはりフロー制御無しで行うことがほとんどです。フロー制御しようとすると通信線以外にも線が必要にってマイコンの貴重なGPIO(汎用IOピン)が消費されるという問題もあります。

これで、シリアル通信を行う上での必要そうな機能のチェックは終わりました。次は実際に通信してみます。

現在、Form1が表示されているかと思いますが、下でまた使いますのでそのままにしておいてください。


実際の通信〜PC−PC間のシリアル通信

 さっそくPC−マイコン間で通信をおこなってみたい感じですが、まず、確実に動くもので通信プログラムを作り、プログラミングの仕方を探ってみます。ということで、PC相手に通信してみます。

 まず物理的な接続を考えます。マイコンのシリアル通信ポートであるCOMポートは大抵9ピンのD−sub(ディーサブ)コネクタというものになってます。古いPCは25ピンのもあるかもしれません。このD−sub9ピンコネクタのピン配列は次のようになっています。

<PCのCOMポートの機能>
ピン番号
信号名(JIS) 信号名(慣例) 説明
CD DCD 受信キャリア検出
RD RxD 受信データ
SD TxD 送信データ
ER DTR データ端末レディ
SG GND 信号GND
DR DSR データセットレディ
RS RTS 送信要求
CS CTS 送信可
CI RI 被呼表示

2番が受信線、3番が送信線で、5番のGNDを基準に電圧のHigh/Lowで通信します。その他の線はフロー制御などに使うので、ほとんど使いません。(マイコンの書き込み装置でDTRとか使うのもある。無線機はRTS/CTSを使う)
信号名ですが、JISでは左のように規定されていますが、書籍などでは右の慣例の方しかみたことがありませんので、ここでも慣例の方の表記で表します。

2台のPCを通信させるわけですが、片方から送信してもう一方で受信するには、送信側の送信線と受信側の受信線をつなぎます。市販のもので、シリアルクロスケーブルというものがありますが、これは下記のように配線されていますのでこれを使えばケーブルを作る必要もありません。
  
PCのシリアルポートの信号は、上のようにRS232Cという規格になっております。上では−12V/+12Vとなっていますが、−3/+3ぐらいでも良いようです。実際にPCのシリアルポートの電圧を測ってみましたが、10Vや7Vのものが多かったです。

+3〜+12Vの時をスペース(論理0)
−3〜−12Vの時をマーク (論理1)

待機時はずっとマーク状態で、マーク−>スペースに変わるときに通信開始となります。このようにして8ビット単位でデータをやりとりします。

ちょうど作業場に「たぶんクロス」というテープが貼られたシリアルケーブルがありましたので、PC2台をつないでみました。デスクトップ(下)の方にVC#を入れてますが、ノートPC(上)には .NET Fream Work を入れてませんので、ノートPCでハイパーターミナルを動かして送信されてくるデータをモニタし、デスクトップPC上でVC#で組んだアプリでなにかデータを送って見ることにします。
PCのシリアルポートは、写真の拡大のようにIOIOIという表示のところです。モニタ用のコネクタと形状が似てますが、シリアルポートの方は2列9ピンです。



さて、先に開いていたForm1をプログラミングして、ノートPCにデータを送るプログラムを作ってみます。
まず、送信するきっかけとなるものが必要ですので、フォームにボタンを配置してみます。

ツールボックスの「Button」をドラックし、Form1の上でドロップします。


すると、下のようにbutton1というボタンが配置されます。コンポーネントを貼り付けた場合はButton->button1のようにクラス名の頭が小文字になり後ろに番号がつきます。プログラム内部ではコンポーネントを識別するのにこの名前が使われます。さらにドラック&ドロップを繰り返すとbutton2,button3...のように数値が増えていきます。この名称などはプロパティで変えられます。
ボタンの名称を変えてみます。ボタンをクリックすると、プロパティの表示がbutton1の内容に変わります。


プロパティを見ると、button1は下のように Name と Text の2つのプロパティがあります。Nameの方はプログラム内部でこのボタンを識別するための内容で、Textの方は実際のボタン上に表示される文字です。
Textプロパティを変更してボタンの表示を「送信」に変えてみます。


下のように表示が変わりました。


次にボタンを押したらなにか送信するようにします。ボタンを押したときにイベントが発生するのでそのイベント内にプログラムを書きます。
button1(送信と表示させたボタン)を 選択したまま、プロパティのイナズマアイコンを押すとボタンのイベントが表示されます。

ボタンはSerialPortコンポーネントとは違い、イベントがたくさんあります。Clickはボタンをクリックしたときに発生するイベントです。下のClickの表示の右のマス上でダブルクリックすると、イベント内のプログラムを書く画面になります。




今度は画面のイメージが変わります。今まではフォームが実際に表示されていましたが、今度はプログラムを書くような画面になりました。今までのページに戻るときには「
デザイナ」のタブを押すと表示が切り替わります。再度コンポーネントを貼り付けたりするときにはデザイナの画面に戻ります。
下の「メンバの切り替え」とプロジェクト管理の場所は後で使います。
この画面を拡大すると次のようになります。


このようにbutton1のClickイベントをダブルクリックすると、button1_Clickというメソッドが作られますのでこの中に送信プログラムを書きます。
実際のプログラムはフォーム自体を表示させたりする文が沢山必要で、前バージョンではかなり長い文が自動生成されましたが、2005ではフォームやコンポーネントを生成する部分などは別ファイルで生成され、ユーザーが作成する部分はすっきりしています。具体的には下のInitializeComponent()の部分は別ファイルになってます。メンバ切り替えのところでこれを選択すると中身が見れるようになってます。自動生成される別なものもこのメンバ切り替え部分で選択すれば中身を見れます。


カーソルがきているところで、このフォームに貼り付けたSerialPort1のWriteメソッドを使って送信プログラムを書いてみます。
.NET環境の開発言語にはインテリセンス機能というものがついており、キーを打つと、想定される文字の一覧を表示してくれますので非常に便利です。また、一覧に自分の書き込みたいものが無かった場合は構文が間違っている可能性が高いので、ビギナープログラマでも打ち間違いが低減されるかと思います。
serialと打つと、予想される候補一覧が表示された状態が下の画面です。


C#では、そのクラスのメンバを使う場合にドットをはさんでメンバ名を記入しますが、クラス名の後にドットを入れると、インテリセンス機能で、そのときにアクセスできるメンバの一覧が表示されます。



そんな感じで作ったのが下のプログラムです。(C#については各自で勉強して下さい。)

※本当は別ファイルにあるディスポーズ(終了時の処理を書くとこ)内でシリアルポートをClose()する処理を追加した方がよいです。書かなくても、フォームを閉じるときにシリアルポートを開放するようですが念のため。

以下概略です。

構成は フィールド、 コンストラクタ、 ボタンクリックのイベント の3つです。

フーィルドは、クラス内で使う変数を宣言するところです。

コンストラクタは、このクラス、この場合はフォーム自体が1つのクラスなわけですが、これが生成(コンストラクト)されるときにおこなう動作や定義や変数宣言を記載します。実際にフォームを生成するには非常に長い文を書かなくてはなりませんが、フォームデザイナで設定した値で生成する文章がInitializeComponent()の中に埋め込まれています。ここでは、フォームを開いた(生成した)ときにシリアルポートの優先権を取りたいのでこの位置でOpen()してます。

イベントではボタンをクリックしたときに送信するデータのセットと、実際の送信メソッドを入れてます。送信データの配列には数値で65〜69のデータを入れてますが、これはASCIIコードに直すと”A〜E”の文字になります。

受信側のノートPCにはC#が入ってませんので、なんらかの手段で結果シリアルポートから受け取りますが、Windowsにかならず入っている機能にハイパーターミナルがあります。これはシリアルポートから受信したデータを文字と解釈して画面に表示するというものです。
よって、上のプログラムを起動させると、ノートPCの方に ABCDE と表示されるはずです。

では実際にやってみましょう。まず、作ったプログラムをビルドします。


ビルドに成功すると画面左下に正常終了と出ます。


ビルドしたプログラムを起動するには「デバックなしで開始」を選択します。



すると、作成したフォームが現れます。これが実体化した状態です。
送信ボタンをポチッと押してみてください。


ということで、簡単にPCのシリアルポートを使うことができました。(何回も押してます。)

ちなみに、ハイパーターミナルの通信設定を、seralPort1と同じにしないと通信できません。


これで使い方がわかったので、次は実際に浅草ギ研製品を動かしてみます。

以下おまけで、マイコンとPCを通信する場合のハード接続について解説します。

PCとマイコンのシリアル通信について(この節はWidowsアプリを組んでみるのページとほぼ同じです)

※ 以下、マイコンとPCの接続を紹介しますが、浅草ギ研のAGB65シリーズもマイコンと同じ電圧ですので同じです。

※PCとAGB65シリーズをハード的につなぐには下記方法でも可能ですが、専用のオプションAGB65-232Cというものがありますのでそちらを使った方が簡単です。

 ロボットの頭脳は大抵マイコンですので基本的にはPCとマイコンを通信させることができればPCからロボットをコントロールできることになります。
 シリアル通信にはクロックで同期を取る「同期通信」と、お互いの通信スピードを決めておき、論理1から0になった時から通信を開始しお互いに自分でデータを取るタイミングをはかる「非同期通信」があります。

一般的なマイコンには同期又は非同期シリアル通信機能がついており、PCにもCOMポートという非同期シリアル通信機能がありますので一見これを接続すれば良いように思われますが、マイコンとPCのシリアル通信の電圧が違いますので直接接続することはできません。しかも、論理1と0の電圧方向が逆だったり、PCからはマイナス電圧が出たりします。
 
論理0
論理1
名称
PC
+3V〜+12V
−3V〜−12V
RS232C電圧レベル
マイコン
0V
5V
TTL電圧レベル

 
マイコンによっては高い電圧やマイナスの電圧を加えると壊れるものもありますのでこれは問題です。
AGB65シリーズとPCを接続する場合はオプションの「AGB65−232C」を使用して、この電圧差を変換して通信できるようにします。

尚、AGB65−232Cのような変換ボードは結構簡単に作れますので自作したい、もしくはマイコンとPCをつなぎたいという場合は下記のMAX232を使う方法を参照願います。











このような場合はそれぞれの電圧を変換するICを使います。代表的なものはMAX232シリーズです。

MAX220〜249のデータシート
(pdfファイル)

 詳しくはデータシート(普通はメーカーのホームページから取ってきます。インターネットで調べればすぐに出てくる)を参照して欲しいのですが、概要図が下のようになっています。(データシートからの抜粋)




 これはRS232CレベルとTTLレベルを変換するICです。PCとマイコンのシリアル通信時の電圧波形は逆になりますので、このRS232ドライバ/レシーバICの図ではインバータ(三角に丸がついてる記号。HighとLowを逆にする素子。詳しくはデジタル回路の書籍を参照)がついており、信号が反転されているのがわかります。しかし、74LS04などの普通のインバータとは違い、ICのまわりに配置したコンデンサで5V電源からRS232C電源(データシートによると平均±7.3Vらしい)を作り出してRS232Cレベルにしています。

 MAX2xxはいろいろな種類がありますが、MAX232Aというのが千石電商で売られています(通販あり)。上の図を見ると232Aの場合はコンデンサは全て0.1 uFを使うようですので、このICとコンデンサ5個があればマイコンとPCを通信させられるということになります。

 回路図は次のようになります。

 
 マイコンのGND、MAX232Aの15番ピンのGND、COMポートの5番ピンの信号GNDはつなぎます。(そうしないと信号の基準電圧0Vが合わないので通信できない。乾電池のマイナス側を外したような状態、電気が流れない。)

 マイコンのシリアル通信用のピンは普通、Tx(送信)、Rx(受信)の2つがあります。送信をして良いかを判定する制御方法を「フロー制御」といい、Tx、Rx、以外のIOを使う通信のやり方もありますが、マイコンはIOが貴重なので普通はTX、Rxのみで勝手に送信、勝手に受信、という感じで通信を行い、受信バッファにデータをためておき、チェックサム(送信した複数データを足した値を最後に送る)などで確認をとったりします。GNDはTx、Rxの基準となる0Vです。

 MAX232Aでは、マイコンのTxから送られたTTLレベルのデータをT2INで受けてT2OUTからRS232Cで出力します。PCから送られたRS232CレベルのデータはR1INで受けてR1OUTからTTLレベルで出力します。これでPC、マイコンともお互いの電圧レベルでデータをやり取りしても正しいデータを送信出来き、壊れるということもおきません。


 PCのCOMポートですが、現在のDOS/V互換機(昔のNEC以外)はD−sub9ピンというタイプのコネクタが一般的です。最近のノートPCなどではCOMポートが無く、USBしか無いという機種もありますので注意してください。USBポートをCOMポートに変換する「USBアダプタ」というものがあり、浅草ギ研でも販売しています。
※USBシリアルアダプタはCOMポートの機能を全てサポートしているというわけではないようですが、浅草ギ研で販売しているUSBアダプタは今のところ問題は起きていません。
 D−sub9ピンタイプのコネクタの場合はRx、Tx以外にもフロー制御を行う為のピンがあります。

<PCのCOMポートの機能>
ピン番号
信号名(JIS) 信号名(慣例) 説明
CD DCD 受信キャリア検出
RD RxD 受信データ
SD TxD 送信データ
ER DTR データ端末レディ
SG GND 信号GND
DR DSR データセットレディ
RS RTS 送信要求
CS CTS 送信可
CI RI 被呼表示
※ピン番号は見る方向で違いますので、コネクタに刻印されている番号で位置を確認して下さい。

 RTSとCTSはセットで使い、フロー制御を行います。DTRとDSRもセットです。DCDとRIは特殊な通信装置の場合にしか使用しません(DCDで無線の搬送波を検出したり、RIで電話が鳴っていることを検出するなど)。詳しくは通信関連の書籍を参照してください。
 最近の通信装置は性能が良くなっているのでフロー制御を使わなくても(バッファにためるなどして)上手く通信できるようになっていますので、有線で通信する場合はフロー制御は使わないのが一般的です。もし、フロー制御を行うとしてもRTS/CTSを使って行う場合があるぐらいです。RTSは送信したい場合にHighにし、通信装置につながっているCTSの線がHighになったら送信を開始するというものです。よって、上の回路図のようにRTSとCTSをつなげるといつでも送信OKの状態になります。これで、もしPC側で間違ってRTS/CTSフロー制御を行う設定になっていたとしても通信が出来ます。

 フロー制御はこのように有線接続時であれば使わなくても問題ありませんが、無線機を間につなぐ場合はフロー制御は必須になりますので注意して下さい。但し、このコーナー(とこれから続くC#関連コーナー)では有線時のみを考えます。



2006年3月27日

 
(C)Copylight 2003. 有限会社浅草ギ研 | 通信販売の法規(訪問販売法第8条)に基づく通信販売業者の表示