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

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

hirocom777.hatenadiary.org

現在クラスモジュール「SerialCom」のコーディングに取り組んでいます。

今回も引き続き、コーディングを行います。

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

TimeOutSettingは、通信時のタイムアウト時間を設定するプロパティープロシージャです。単位はミリ秒になります。

詳細は以下をご確認ください。設定項目は複数あるのですが、細かい設定は手間なので全部同じ値を設定しています。

https://learn.microsoft.com/ja-jp/windows/win32/api/winbase/ns-winbase-commtimeouts

このプロパティープロシージャも、Port_を確認してポート番号が設定されている場合のみ設定を実施します。 まずはセッターからです。

'タイムアウト設定
Public Property Let TimeOutSetting(ByVal timeOut As Long)
  'ポート未設定の場合処理しない
  If PortNo_ = 0 Then Exit Property

  'COMMTIMEOUT構造体に設定
  fCOMMTIMEOUTS.ReadIntervalTimeout = timeOut
  fCOMMTIMEOUTS.ReadTotalTimeoutMultiplier = timeOut
  fCOMMTIMEOUTS.ReadTotalTimeoutConstant = timeOut
  fCOMMTIMEOUTS.WriteTotalTimeoutMultiplier = timeOut
  fCOMMTIMEOUTS.WriteTotalTimeoutConstant = timeOut
  
  '設定実施
  Dim resultData As Long
  resultData = SetCommTimeouts(handleNo, fCOMMTIMEOUTS)
End Property

ゲッターは以下になります。

'タイムアウト設定確認
Public Property Get TimeOutSetting() As Long
  'ポート未設定の場合処理しない
  If PortNo_ = 0 Then Exit Property
  
  '設定値を返す
  TimeOutSetting = fCOMMTIMEOUTS.ReadIntervalTimeout
End Property

データの書込み

続いてデータの書込みです。こちらもPort_を確認して、ポート番号が設定されている場合のみ実施します。 指定された文字列をバイト型の配列に変換して書き込んでいます。

'データの書込み
Public Sub WriteData(sendData As String)
  'ポート未設定の場合処理しない
  If PortNo_ = 0 Then Exit Sub
  
  '書込み内容をバイトの配列に変換
  Dim writeBuf() As Byte
  writeBuf = StrConv(sendData, vbFromUnicode)
  Dim writeBytes As Long
  writeBytes = UBound(writeBuf) + 1
  
  '送信実行
  Dim resultData As Long
  Call WriteFile(handleNo, writeBuf(0), writeBytes, resultData, 0)
End Sub

データの読み出し

データの読み出しも、Port_を確認して、ポート番号が設定されている場合のみ実施します。また、受信バッファーを確認して受信データを確認したときのみ読み込みます。 こちらは書込みと逆で、バイト型の配列形式で読み込んだ内容を文字列に変換しています。

'データの読み出し
Public Function ReadData() As String
  'ポート未設定の場合処理しない
  If PortNo_ = 0 Then Exit Function
  
  '受信データ確認
  Dim resultData As Long
  Call ClearCommError(handleNo, resultData, fCOMSTAT)
  If 0 < fCOMSTAT.cbInQue Then Exit Function
  
 ' 読込み内容を文字列に変換
  Dim readByte As Long
  readByte = fCOMSTAT.cbInQue
  ReDim readBuf(readByte - 1) As Byte
  Call ReadFile(handleNo, readBuf(0), readByte, resultData, 0)
  ReadData = StrConv(readBuf, vbUnicode)
End Function

次回は簡単な使用例

いかがでしょうか。これでクラスモジュールが完成しました。次回は簡単な使用例をご紹介しようと思います。お楽しみに!!

hirocom777.hatenadiary.org