クラスのコーディング(Excelでシリアル通信-9)

Excelからシリアル通信を実現してみようという連載の9回目です。前回の記事はこちらになります。

hirocom777.hatenadiary.org

前回は、作成したLoopBackTestToolの改善点を考えました。そして、それらの問題を解決するにはクラスモジュールを使うことが効果的だと判りました。さらに、クラスモジュールの構成について考えてみました。

今回から、いよいよクラスモジュールのコーディングにとりかかります。モジュール名は「SerialCom」としましょう。

コンストラクターとデストラクター

まずはコンストラクターとデストラクターです。以下の様にしてみました。

'初期化
Private Sub Class_Initialize()
  PortNo_ = 0
End Sub

'終了処理
Private Sub Class_Terminate()
  'ポートクローズ
  CloseHandle handleNo
End Sub

前回もお話した通りVBAコンストラクターは値を渡すことができませんので、できることは限られています。ですので、ここでは作成されたオブジェクトのポート番号が設定されているかどうかの確認のため、ポート番号を指定するプロパティー「PortNo_」(後述)に0を設定します。ポート番号は1以上の整数で指定されますので、この値が0の場合、設定が未だということです。デストラクターの処理は、プロパティー「handleNo」(コチラも後述)で指定されるポートのクローズです。

プロパティー

続いてプロパティーです。SerialComには以下のプロパティーがあります。

  • PortNo_

    ポート番号を指定、保存する変数です。

  • handleNo

    ポート番号を指定してポートを開くと、Windowsはポートに番号を割り当てて、以後その番号を指定してポートを操作します。この番号の保存する変数。

PortNo_とhandleNoは、ダイナミック リンク ライブラリ (DLL) の参照、その他の宣言の後に以下の様に記述します。

Private PortNo_ As Long
Private handleNo As Long
  • PortNo

    ポート番号の指定および指定時の処理とポート番号の「PortNo」の保存を行うプロパティープロシージャです。読み出し時は「PortNo」の値を返します。

  • PortSetting

    通信の設定を行うプロパティープロシージャです。設定は文字データ「BAUD=9600 PARITY=N DATA=8 STOP=1」の形で行います。読み出し字は同様の文字データを返します。

  • TimeOutSetting

    タイムアウト時間の設定を行うプロパティープロシージャです。単位はミリ秒です。読み出し字は同様の数値を返します。

各プロパティープロシージャのコードについて見ていきましょう。

PortNoプロパティープロシージャ

PortNoプロパティープロシージャのコードです。セッターは以下の様になります。

'ポート番号を指定します
Public Property Let PortNo(ByVal comPort As Long)

  '0以外に設定されている場合は処理しない
  If PortNo_ <> 0 Then Exit Property

  'ポート指定とオープン
  PortNo_ = comPort
  handleNo = CreateFile("\\.\COM" & CStr(comPort), _
             GENERIC_READ Or GENERIC_WRITE, _
             0&, 0&, OPEN_EXISTING, 0&, 0&)
                  
  'バッファの設定とクリア
  Dim resultData As Long
  resultData = SetupComm(handleNo, 2048, 2048)
  resultData = PurgeComm(handleNo, PURGE_TXCLEAR)
  resultData = PurgeComm(handleNo, PURGE_RXCLEAR)
  
  '通信設定
  PortSetting = "BAUD=9600 PARITY=N DATA=8 STOP=1"
  
  'タイムアウト1秒に設定
  TimeOutSetting = 1000
End Property

指定された番号でポートを開きます。すでに設定してあるポートの再設定はできません。ポート番号はPortNo_に記録され、開いたポートにWindowsが割り当てた番号はhandleNoに記録されます。また、ポートオープンと同時に通信バッファーのクリアと、その他の初期設定も行います。初期設定のままでよければポート番号を指定するだけで通信が可能となります。

ゲッターはPortNo_の値を返します。

'ポート番号を取得します
Public Property Get PortNo() As Long
  PortNo = PortNo_
End Property

次回もコーディング

いかがでしょうか。次回は通信設定のプロパティープロシージャについてコーディングします。

hirocom777.hatenadiary.org