前回で、ちょっと述べたシリアルポートについて、現在、自分が実験用に使用しているシリアルポートを使用するクラスを簡単に紹介しておく。実は、このクラス自体,自分が作成したものでは無いのだが、オブジェクト指向というのは、この様に、分担して生成するものだと、考えてもらいたい。これをそのまま使用すれば、シリアルポートは、簡単に扱える様になるのであるから、利用しない手は無いだろう。
- サンプルの動作説明
今回作成したサンプルは、COMMポート1を、600bps,8bit,EVENパリティ,ストップビット1で開き、スレッド側で受信したデータを表示し、16進数で入力したデータを、送信するというものである。
テストサンプル012
- シリアルクラス(class TSerial)
サンプルに同梱したrs.h及びrs.cppが、クラスの実体という事になる。既に、Serialというクラスへのポインタが用意されているので、ユーザは、プログラムの先頭で、Serial=new TSerial() ;を実行すれば良い。また、ポートを使わなくなったら、delete Serial ;すれば良いだろう。このクラスは変数として実体を持たないので、newしなくても使えてしまうのだが、作法として、やっておくと頭の中で整理が付くのではないだろうか?
- 使用方法について
このクラスの使用方法については、メンバ関数の説明をする事によって説明する。
- OpenCommDevice(const char *Port)
シリアルポートを開くというイメージだが、単純に、Commポートの番号を指定すると考えても良い。実は、クラス内でCreateFile()を実行しており、そのハンドルを戻り値としている。即ち、この値が、INVALID_HANDLE_VALUE(無効なハンドル)であれば、シリアルポート(COMMポート)のオープンに失敗したと考えて良い。
Shandle=Serial->OpenCommDevice("COM1") ;
|
- InitCommPort(HANDLE yh, DWORD dwEvtMask,
DWORD RxBuffSize, DWORD TxBuffSize)
シリアルポートの処理ルーチンを初期化するイメージ。受信/送信バッファのサイズと、マスクするイベントを設定するが、普通はイベントマスクは無し(0)で使う。シリアルポートからのハードウエア割り込みは、ハンドラの方で勝手に取得してくれるし、送信については、送信バッファに入れておけば順次出力してくれるので、送受信バッファのサイズは、連続して送信するデータ数,受信メッセージの長さ,及びアプリの動作スピードと合わせて考えなければならない。速い速度で扱う場合は、多めに取るし、9600bps以下ならば、メモリ節約の意味で、1024バイト程度でも問題無いだろう。初期化が完了した場合、0を返す仕様になっているので、0以外ならば、エラー処理をすれば良い。
Serial->InitCommPort(Shandle,0,1024,1024) ;
|
- SetCommPort(HANDLE yh,UINT BaudRates,BYTE DataBits,int StopBit,
int Parity, bool CtsFlow, bool XparameterFlow)
シリアルポートのボーレートを設定する。
BaudRatesはダイレクトに数値を設定すれば良い。(9600bpsならば9600)
DataBitsについても同様にダイレクトに数値を設定する。(8bitならば8)
StopBitは、0が1ビット,1が1.5ビット,2が2ビットを示す。
Parityは、0がパリティ無し,1が奇数パリティ,2が偶数パリティである。
CtsFlow,XparameterFlowについては、それぞれのフロー制御を行う場合にTRUEを設定する。
正しく設定出来れば、0を返すので、0以外で有ればエラー処理を行えば良い。
Serial->SetCommPort(Shandle,600,8,0,2,FALSE,FALSE) ;
|
- rs(HANDLE yh)
シリアルポートが受信した文字数を返す。
- RsinStr(HANDLE yh, int n, unsigned char *Rbuf)
シリアルポートから、受信したデータをnバイト取り出す。
RcvLength=Serial->rs(Shandle) ;
if(RcvRength)
Serial->RsinStr(Shandle,RdvLength,buff) ;
|
- Rsouts(HANDLE yh,int n,unsigned char *Str)
シリアルポートにnバイトのデータ送信を行う。
Serial->Rsouts(Shandle,10,buff) ;
|
- StopComm(HANDLE yh)
シリアルポートを停止する。
Serial->StopComm(Shandle) ;
|
|