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

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

hirocom777.hatenadiary.org

前回からクラスモジュール「SerialCom」のコーディングにとりかかりました。コンストラクター、デストラクター、そして一部のプロパティーについて進めました。

今回も引き続き、プロパティーに取り組みたいと思います。

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

PortSettingは、通信設定を行うプロパティープロシージャです。以下の項目を設定します。

  • ボーレート(通信速度)

    通信速度です。単位はbpsです。300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 57600, 115200 から指定します。デフォルトは9600です

  • パリティービット

    パリティービットの指定です。E(偶数)、O(奇数)、N(なし)から指定します。デフォルトはNです

  • データビット長

    送受信するデータのビット長です。5, 6, 7, 8 から指定します。デフォルトは8です

  • ストップビット

    送信後のストップビット長です。1, 1.5, 2 から指定します。デフォルトは1です

設定は文字データによって行います。

BAUD=ボーレート PARITY=パリティービット DATA=データビット長 STOP=ストップビット

「BAUD=9600 PARITY=N DATA=8 STOP=1」の様に書きます。まずはセッターのコードです。

'通信設定
Public Property Let PortSetting(ByVal PortSetting As String)
  'ポート未設定の場合処理しない
  If PortNo_ = 0 Then Exit Property
  
  '各設定に分解
  PortSetting = StrConv(PortSetting, vbNarrow + vbUpperCase)
  Dim eachData As Variant
  eachData = Split(PortSetting, " ")
  Dim i As Long
  For i = 0 To UBound(eachData)
    Dim baudRateData As Long
    If eachData(i) Like "*BAUD=*" Then baudRateData = CLng(Replace(eachData(i), "BAUD=", ""))
    Dim parityBitData As String
    If eachData(i) Like "*PARITY=*" Then parityBitData = Trim(Replace(eachData(i), "PARITY=", ""))
    Dim byteSizeData As Long
    If eachData(i) Like "*DATA=*" Then byteSizeData = CLng(Replace(eachData(i), "DATA=", ""))
    Dim stopBitsData As Double
    If eachData(i) Like "*STOP=*" Then stopBitsData = CDbl(Replace(eachData(i), "STOP=", ""))
  Next i
  
  'ボーレート
  Select Case baudRateData
  Case 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 57600, 115200
    fDCB.BaudRate = baudRateData
  Case Else
    fDCB.BaudRate = 9600
  End Select
  
  'パリティービット
  Select Case parityBitData
  Case "E"
    fDCB.Parity = 2
  Case "O"
    fDCB.Parity = 1
  Case Else
    fDCB.Parity = 0
  End Select
  
  'データビット長
  Select Case byteSizeData
  Case 5, 6, 7, 8
    fDCB.ByteSize = byteSizeData
  Case Else
    fDCB.ByteSize = 8
  End Select
  
  'ストップビット
  Select Case stopBitsData
  Case 1.5
    fDCB.StopBits = 1
  Case 2
    fDCB.StopBits = 2
  Case Else
    fDCB.StopBits = 0
  End Select

  '設定実施
  Dim resultData As Long
  resultData = SetCommState(handleNo, fDCB)
End Property

まずPort_を確認して、ポート番号が設定されている場合のみ設定実施します。取得した文字列からキーワードを手掛かりに各設定値を抽出して指定します。無効な値が記述されている場合は、デフォルト値を指定します。指定された内容はDCB構造体に保存されて、これを使って設定します。

次にゲッターです。DCB構造体に保存してある内容から同じ形式の文字データを返します。

'設定の読込み
Public Property Get PortSetting() As String
  'ポート未設定の場合処理しない
  If PortNo_ = 0 Then Exit Property

  'パリティービット
  Dim parityBitData As String
  Select Case fDCB.Parity
  Case 2
    parityBitData = "E"
  Case 1
    parityBitData = "O"
  Case Else
    parityBitData = "N"
  End Select
   
  'ストップビット
  Dim stopBitData As String
  Select Case fDCB.StopBits
  Case 0
    stopBitData = "1"
  Case 1
    stopBitData = "1.5"
  Case 2
    stopBitData = "2"
  End Select

  '設定文字列の構築
  PortSetting = "BAUD=" & fDCB.BaudRate _
              & " PARITY=" & parityBitData _
              & " DATA=" & fDCB.ByteSize _
              & " STOP=" & stopBitData
End Property

次回もさらにコーディング

いかがでしょうか。通信設定は項目が多いので長くなってしまいました。次回は残りのプロパティーとメソッドに取り組みます。お楽しみに!!

hirocom777.hatenadiary.org