Excelからシリアル通信を実現してみようという連載の11回目です。前回の記事はこちらになります。。
現在クラスモジュール「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
次回は簡単な使用例
いかがでしょうか。これでクラスモジュールが完成しました。次回は簡単な使用例をご紹介しようと思います。お楽しみに!!