Excelからシリアル通信を実現してみようという連載の9回目です。前回の記事はこちらになります。
前回は、作成した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
次回もコーディング
いかがでしょうか。次回は通信設定のプロパティープロシージャについてコーディングします。