Wabaはwaba.ioパッケージのPortクラスによるシリアル通信を サポートしています。(訳注:waba.io.Portはベータ7からSerialPortに変わりました)
Portクラスはシリアルポートのアクセスに限られたものではありません。 将来、Portクラスはパラレルポートや赤外線ポートの通信に 使われるようになるでしょう。しかし、現在のリリースでは シリアル通信だけがサポートされています。
デバイスのシリアルポートに接続し、データを送受信するサンプルコードを 検討してみましょう。
シリアルポートのオープン
まずシリアルポートへの通信路をつくります:
Port port = new Port(Port.SERIAL, 0, 9600); if (!port.isOpen()) return; // error
Portコンストラクタの1番目の引数はポートのタイプです。
この場合はシリアルポートを開いています。
2番目の引数はポート番号です。この場合はデフォルトのポートを開くために0を
指定しています。PalmPilotやWindows CEデバイスのような小型デバイスでは、
ポート0が唯一のシリアルポートであることが多いです。
3番目の引数はボーレートです。この場合は9600です。
通信する2つのデバイスは同一のボーレートを設定する必要があります。
読込みと書きこみ
ポートがオープンされました。ポートに読込みと書きこみを行ないましょう。
シリアルポートへ2バイト(値100と101)を書きこんでみましょう:
byte buf[] = new byte[2]; buf[0] = 100; buf[1] = 101; if (port.writeBytes(buf, 0, 2) != 2) return; // error
次にシリアルポートから2バイトを読み込んでみましょう:
if (port.readBytes(buf, 0, 2) != 2) return; // error
ポートのクローズ
ポートを使い終えたら、それをクローズしてください。
port.close();
ポートのクローズを忘れた場合、ガベージコレクタがポートを開放します。
開放の前にポートはクローズされます。
しかしポートは使い終えたときにクローズした方が良いです。
その理由は、小型デバイスではシリアルポートをオープンしていると
多くの電池を消費したり、他のプログラムが同一のポートを使うかも
しれないからです。
ビットとバイト
あなたがシリアルポートについて良く知っているなら、
どこでバイトサイズやパリティ、ストップビット、
CTS/RTS、XON/XOFF、ポートのタイムアウトを設定するのか不思議に思うでしょう。
シリアルポートのAPIを開発する際、自由度と簡潔さのバランスを決めなければ
なりませんでした。
8ビットバイト、パリティなし、1ストップビットの設定が
シリアルポート通信で広く使われていることがわかりました。
それらの値はPortクラスを使ってシリアルポートをアクセスするときの
設定です。現在、それらを変えるAPIはありません。
フロー制御
シリアルポートは多種多様なハードウェアやソフトウェアを通した
フロー制御をサポートしています。
Portクラスはソフトウェア・フロー制御をサポートしていません。
ソフトウェア・フロー制御はプラットフォームによってサポートされないからです。
たとえばPalmPilot用の文書によると、PalmPilotは
XON/XOFFフロー制御(ソフトウェア・フロー制御)をサポートをしていません。
ハードウェア・フロー制御はサポートされます。実際、
RTS/CTSフロー制御はPalmOSやWin32プラットフォーム上の
全てのシリアル通信で自動的に使われます。しかし、
Windows CEプラットフォームでは自動的に使われません。
Windows CE上のハードウェア・フロー制御のデフォルトが
OFFである理由については"Windows CEのシリアル通信"
をご覧ください。
ハードウェア・フロー制御は多くのプラットフォームでデフォルトがONなので、
デバイスがハードウェア・フロー制御を使っているかを確かめる必要があります。
あるデバイスはハードウェア・フロー制御を使って、もう片方のデバイスは
フロー制御を使わなければ、前者のデバイスは後者のデバイスが
データを受け付けられるようにタイムアウトするまで待つでしょう。
ハードウェア・フロー制御のないデバイスと通信する場合は,
Portのソフトウェア・フロー制御をOFFにできます:
port.setFlowControl(false);
同様に、フロー制御をONにする場合はsetFlowControl(true)を使います。
タイムアウト
読込み操作を行なう時、シリアル線にデータがなければ、どうなるでしょうか?
プログラムはデータを待つためハングするのでしょうか?
答えはNoです。Portクラスは読込みタイムアウトを設定するAPIを
含んでいます。このコードは100ミリ秒(0.1秒)の読込みタイムアウトを
設定しています:
port.setReadTimeout(100);
読込みタイムアウトはシリアル線上にデータがないとき、
どのくらいの間データを待つかを指定します。
デフォルトは100ミリ秒です。
データが無いとき、read()呼び出しからすぐに戻って欲しい場合は
読込みタイムアウトに0を設定します:
port.setReadTimeout(0);
PalmPilotのシリアルポート通信
PalmPilotのシリアルポートを使うとき、注意すべき"性質"があります。
この性質は3Comのウェブサイトの
このページ
に文書化されています。
また、高いボーレート(576000ボー)を使うとRTS/CTSハードウェア・フロー制御
を使っていても、PalmPilotのシリアルポートは暴走するおそれがあります。
PalmPilotの読込みに対してデータがあまり速く来ると、暴走が起きます。
Windows CEのシリアルポート通信
Windows CEデバイス(Cassiopeiaで試験)はRTS/CTSフロー制御を使うと、
RTS/CTSフロー制御を使うデスクトップマシンと通信できないでしょう。
したがってWindows CEのハードウェアフロー制御のデフォルト値はOFFです。
フロー制御がOFFでもWindows CEデバイスとフロー制御を使うデスクトップマシンは
通信できます。
デフォルトで、PortクラスはWindows CEデバイスのRTSラインを有効にします。
これはフロー制御を使うデスクトップマシンが
フロー制御を使わないWinodows CEデバイスと通信することを可能にします。
試験ではフロー制御がOFFであっても、Windows CEデバイスは
デスクトップPCと57600ボーレートで通信できました。
ハードウェア・フロー制御を使うデスクトップアプリケーションを
開発する際、デフォルトでフロー制御の設定を残すなら、
Wabaを動かしているどんなデバイスを使っても動作できるようにすべきです。
参考資料
下記のウェブサイトはシリアルポートについて基礎からハードウェアレベルの動作まで
説明しています:
http://www.lvr.com/serport.htm
シリアルポートをオープンするとき、PalmOS 2.0で動作するPalmPilotは
シリアル線にバックスペース文字(値8)を書きこむでしょう。
またポートをクローズするとき、PalmPilotは削除文字を送ります。
原文:Copyright (c) 1999 Wabasoft. Waba, WabaVM and WabaSDK are trademarks of
Wabasoft Inc.