[[BORLAND C++]]
INDEX
Section.11 SerialProt
前回で、ちょっと述べたシリアルポートについて、現在、自分が実験用に使用しているシリアルポートを使用するクラスを簡単に紹介しておく。実は、このクラス自体,自分が作成したものでは無いのだが、オブジェクト指向というのは、この様に、分担して生成するものだと、考えてもらいたい。これをそのまま使用すれば、シリアルポートは、簡単に扱える様になるのであるから、利用しない手は無いだろう。

  • サンプルの動作説明
    今回作成したサンプルは、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) ;


2002/04/25
HomeSweetHome2
Ozzy's Software