【目次】
1.目的:シリアル通信の送受信を行う
2.作業1:シートを作る
3.作業2:コードを書く
1.目的:シリアル通信の送受信を行う
シリアル通信の超簡易的な送受信ツールをエクセルで作成します。
2.作業1:シートを作る
超簡易的なツールのため、必要最小限の機能をワークシート上に用意します。シートは以下の2つです。
①送受信シート
送信データの設定、受信データの表示、送受信を行うボタンを
配置したシート
※ボタンの配置方法は、別のテーマで記載します(宿題)。
②通信設定シート
ポート番号、ボーレート(通信速度)、データ長、パリティ
ビットの種類、ストップビット(長)、各通信処理の待ち
時間を設定するシート
3.コードを書く
今回、コードは「標準モジュール」の「Module1」に書きます。いろんなやり方があると思いますが、とにかくシンプルにします。
尚、私もいろいろなサイトを調べながら作ったもので、全てのコードを完璧に理解しているわけではありませんので、あくまで参考に留めて頂きたく、予めご了承下さい。また、参考ついでに作成、及び、動作確認した環境は以下の通りです。
OS:Windows10 Home Edition(64ビット)
アプリ:Microsoft Office Home and Business 2019
‘シリアルポートのオープン関数の定義
Declare Function CreateFile Lib “kernel32” Alias “CreateFileA” _
(ByVal lpFileName As String, ByVal dwDesiredAccess As Long, _
ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, _
ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, _
ByVal hTemplateFile As Long) As Long
‘シリアルポートのクローズ関数の定義
Declare Function CloseHandle Lib “kernel32” _
(ByVal hObject As Long) As Long
‘シリアルポートの設定関数の定義
Declare Function SetCommState Lib “kernel32” _
(ByVal hCommDev As Long, lpDCB As DCB) As Long
‘タイムアウトの設定関数の定義
Declare Function SetCommTimeouts Lib “kernel32” _
(ByVal hFile As Long, lpCommTimeouts As COMMTIMEOUTS) As Long
‘データの送信関数の定義
Declare Function ReadFile Lib “kernel32” _
(ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, _
lpNumberOfBytesRead As Long, lpOverlapped As Long) As Long
‘データの受信関数の定義
Declare Function WriteFile Lib “kernel32” _
(ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, _
lpNumberOfBytesWritten As Long, lpOverlapped As Long) As Long
‘ DCB構造体の定義
Type DCB
DCBlength As Long ‘構造体のサイズ
baudrate As Long ‘ボーレイト(bps)の設定
fBitFields As Long ‘ビット単位のフィールド定義
wReserved As Integer ‘予約(0をセットする)
XonLim As Integer ‘受信バッファ中のデータが何バイトになったらXon文字を送るかを指定
XoffLim As Integer ‘受信バッファの空きが何バイトになったらXoff文字を送るかを指定
ByteSize As Byte ‘1データのビット数を指定
Parity As Byte ‘パリティの方式を指定
StopBits As Byte ‘ストップビット数を指定
XonChar As Byte ‘Xon文字を指定
XoffChar As Byte ‘Xoff文字を指定
ErrorChar As Byte ‘パリティエラーの場合に使う文字を指定
EofChar As Byte ‘非バイナリモードの場合のデータ終了文字の指定
EvtChar As Byte ‘イベントを生成する文字を指定
End Type
‘ COMMTIMEOUTS構造体の定義
Type COMMTIMEOUTS
ReadIntervalTimeout As Long ‘文字の読み込みの待ち時間
ReadTotalTimeoutMultiplier As Long ‘読み込みの1文字あたりの時間
ReadTotalTimeoutConstant As Long ‘読み込みの定数時間
WriteTotalTimeoutMultiplier As Long ‘書き込みの1文字あたりの時間
WriteTotalTimeoutConstant As Long ‘書き込みの定数時間
End Type
Private hComm As Long ‘ポートのハンドル
Private stDCB As DCB ‘DCB構造体を変数に割り付ける
Private timeOut As COMMTIMEOUTS ‘COMMTIMEOUTS構造体を変数に割り付ける
‘ 送受信ボタン押下時の処理
Sub comm_start()
‘=== シリアルポートをオープンする ===
Const GENERIC_READ = &H80000000 ‘読み取り用定数
Const GENERIC_WRITE = &H40000000 ‘書き込み用定数
Const OPEN_EXISTING = 3 ‘既存のファイルの処理
comname = Sheets(“通信設定シート”).Cells(2, 2).Value ‘使用するポートの選択
‘ポートのオープン
hComm = CreateFile(comname, GENERIC_READ Or GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0)
CommInfo = hComm
‘ポートのオープン失敗時
If hComm = -1 Then
‘警告メッセージ アイコンを表示
MsgBox comname & “が使えません”, vbCritical
End ‘強制終了
End If
‘=== シリアル通信の設定 ===
stDCB.baudrate = Sheets(“通信設定シート”).Cells(3, 2).Value ‘転送速度の指定
stDCB.ByteSize = Sheets(“通信設定シート”).Cells(4, 2).Value ‘ビット長の指定
stDCB.fBitFields = &H3001 ‘バイナリモードのフラグを有効にし、
‘RTSの制御を設定する(それ以外はFalseにする)
stDCB.Parity = Sheets(“通信設定シート”).Cells(5, 2).Value ‘パリティの設定
stDCB.StopBits = Sheets(“通信設定シート”).Cells(6, 2).Value ‘ストップビットを指定
dummy = SetCommState(hComm, stDCB) ‘必要な部分だけ書き換える
‘=== タイムアウトの設定 ===
timeOut.ReadIntervalTimeout = Sheets(“通信設定シート”).Cells(7, 2).Value ‘文字の読み込み待ち時間
timeOut.ReadTotalTimeoutMultiplier = Sheets(“通信設定シート”).Cells(8, 2).Value ‘読み込みの1文字あたりの時間
timeOut.ReadTotalTimeoutConstant = Sheets(“通信設定シート”).Cells(9, 2).Value ‘読み込みの定数時間
timeOut.WriteTotalTimeoutMultiplier = Sheets(“通信設定シート”).Cells(10, 2).Value ‘書き込みの1文字あたりの時間
timeOut.WriteTotalTimeoutConstant = Sheets(“通信設定シート”).Cells(11, 2).Value ‘書き込みの定数時間
dummy = SetCommTimeouts(hComm, timeOut) ‘タイムアウトの設定
‘=== データの送信 ===
Dim wData As String ‘送信データの変数宣言(文字変数として定義)
Dim wLen As Long ‘送信されたデータ長の変数宣言
Dim dLen As Long ‘送信するデータ長の変数宣言
Dim snd_data As String ‘送信するデータ
snd_data = Sheets(“送受信シート”).Cells(2, 3).Text ‘送信データの設定
wData = snd_data & Chr(13) ‘入力データ+リターン符号の付加
dLen = LenB(StrConv(wData, vbFromUnicode)) ‘ANSI+DBCS文字でのバイト数に換算
dummy = WriteFile(hComm, ByVal wData, dLen, wLen, 0) ‘データの送信
‘=== データの受信 ===
Dim rData As String ‘受信データの変数宣言(文字変数として定義)
Dim rLen As Long ‘受信されたデータ長の変数宣言
rData = space(100) ‘100文字分の領域確保
dummy = ReadFile(hComm, ByVal rData, 100, rLen, 0) ‘データの受信
Sheets(“送受信シート”).Cells(3, 3).Value = RTrim(rData) ‘後ろの空白を削除する
‘=== シルアルポートを閉じる ===
dummy = CloseHandle(hComm)
End Sub
参考になれば幸いです。