|
●CreateFile
lpCommNameに指定されたポート番号の利用開始を宣言します。lpCommNameには例えばポート番号を格納した文字変数または文字定数"COM1"を与えます。パラレルポートを選択する場合は"LPT1"等とします。この関数はポートだけでなく、全てのファイルに適用することができます。ファイルを開いたり、新規に作成する場合はlpCommNameにファイル名やディレクトリを指定したファイル名を与えます。
双方向通信でポートを利用する場合はdwDesiredAccessはGENERIC_READ
| GENERIC_WRITEと指定します。dwShareModeは0、lpSecurityAttributesは0とします。dwCreationDistributionはOPEN_EXISTINGとし、dwFlagsAndAttributesはFILE_ATTRIBUTES_NORMALとします。
hTemplateFileはアトリビュートをコピーするためのテンプレート・ファイルのハンドル番号ですが通信では使いませんので0とします。
関数の戻り値はハンドル番号です。ポートが実在しない、あるいは他のアプリケーションが使用している等の場合には-1が返されます。正常にハンドル番号を取得できた場合は0より大きな値が返されます。
●CloseHandle
指定したハンドル番号のポート利用を終了する場合にこの宣言を行います。アプリケーションを終了するまでには必ずこの宣言を行う必要があります。
|
'***********************************************************************
' 通信ポートを開く、または閉じる。
'***********************************************************************
Public Declare Function CreateFile Lib "kernel32" Alias "CreateFileA"
(ByVal lpCommName 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
'Original Definition
'Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal
lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode
As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal
dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal
hTemplateFile As Long) As Long
' LPCTSTR lpFileName, "COM1" // pointer to name of the file
' DWORD dwDesiredAccess, GENERIC_READ Or GENERIC_WRITE // access
(read-write) mode
' DWORD dwShareMode, 0 // share mode
' LPSECURITY_ATTRIBUTES lpSecurityAttributes, 0 // pointer to security
descriptor
' DWORD dwCreationDistribution, OPEN_EXISTING // how to create
' DWORD dwFlagsAndAttributes, FILE_ATTRIBUTES_NORMAL // file attributes
' HANDLE hTemplateFile, 0 // handle to file with attributes to copy
Public Declare Function CloseHandle Lib "kernel32" (ByVal hCom As
Long) As Long
'
Public Const GENERIC_READ = &H80000000 ' /* from
WINNT.H */
Public Const GENERIC_WRITE = &H40000000 ' /* from
WINNT.H */
Public Const GENERIC_EXECUTE = &H20000000 ' /*
from WINNT.H */
Public Const GENERIC_ALL = &H10000000 ' /* form
WINNT.H */
'
Public Const CREATE_NEW = 1
Public Const CREATE_ALWAYS = 2
Public Const OPEN_EXISTING = 3
Public Const OPEN_ALWAYS = 4
Public Const TRUNCATE_EXISTING = 5
'
Public Const FILE_ATTRIBUTE_READONLY = &H1
Public Const FILE_ATTRIBUTE_HIDDEN = &H2
Public Const FILE_ATTRIBUTE_SYSTEM = &H4
Public Const FILE_ATTRIBUTE_DIRECTORY = &H10
Public Const FILE_ATTRIBUTE_ARCHIVE = &H20
Public Const FILE_ATTRIBUTE_NORMAL = &H80
Public Const FILE_ATTRIBUTE_TEMPORARY = &H100
Public Const FILE_ATTRIBUTE_COMPRESSED = &H800
'
|
●SetupComm
Win32APIのWindows側が使う受信キューと送信キューのバイト・サイズを指定します。
|
'***********************************************************************
' 通信ポートの受信バッファ、及び送信バッファを確保する。
'***********************************************************************
Public Declare Function SetupComm Lib "kernel32" (ByVal hCom As
Long, ByVal dwInQueue As Long, ByVal dwOutQueue As Long) As Long
|
●WriteFile
hComはハンドル番号、lpBufferは送信データを格納している配列領域の先頭アドレスです。例えばバイト型配列TxBuf()の先頭から5バイト目から送信データが格納されている場合にはTxBuf(4)のように指定します。
nNumberOfBytesToWriteは送信するデータのバイト数です。Long型の定数または変数で与えることができます。一方、lpNumberOfBytesWrittenは実際に送信バッファに格納することができたバイト数を戻すための変数アドレスを与えます。常にLong型でなければなりません。
lpOverlappedは使用しませんので0とします。
●ReadFile
hComはハンドル番号、lpBufferは受信データを格納する配列領域の先頭アドレスです。例えばバイト型配列RxBuf()の先頭番地から受信データを格納する場合にはRxBuf(0)のように指定します。
nNumberOfBytesToReadは受信を希望するデータのバイト数です。Long型の定数または変数で与えることができます。一方、lpNumberOfBytesReadは実際に受信バッファに格納することができたバイト数を戻すための変数アドレスを与えます。常にLong型でなければなりません。受信キューに指定バイト数のデータが蓄積されている場合にはnNumberOfBytesToReadとnNumberOfBytesReadは一致しますが、タイムアウト等が発生すると一致しません。
lpOverlappedは使用しませんので0とします。
|
'***********************************************************************
' 通信ポートの受信バッファからの読み出し、及び送信バッファに対する書き込み。
'***********************************************************************
Public Declare Function WriteFile Lib "kernel32" (ByVal hCom As
Long, ByRef lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, ByRef
lpNumberOfBytesWritten As Long, ByVal lpOverlapped As Long) As Long
Public Declare Function ReadFile Lib "kernel32" (ByVal hCom As Long,
ByRef lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, ByRef
lpNumberOfBytesRead As Long, ByVal lpOverlapped As Long) As Long
'Public Type OVERLAPPEDstructure ' OVERLAPPED構造体はWindows NTで機能する。
' Internal As Long ' Windows95では機能しない。
' InternalHigh As Long
' offset As Long
' OffsetHigh As Long
' hEvent As Long
'End Type
|
◆DCB構造体
シリアル(RS232C)ポートのボーレートBaudRate、通信モードがテキスト・モードかバイナリー・モートか、パリティーチェックの有無、ハードウェアまたはソフトウェア・ハンドシェーク制御の方法等のフラグ設定、XON/XOFFプロトコルを行うバイト・サイズ、データ長(4bit〜8bit)、パリティーチェックの方法(0:無し,1:奇数,2:偶数,3:マーク,4:スペース)、ストップ・ビット長(0:1bit,
1:1.5bits, 2:2bits)、XONやXOFFで使用するキャラクタ・コード、エラー文字コード、入力エンド・キャラクタ・コード、受信イベント・キャラクタ・コード等を指定するために用いる構造体です。
GetCommState、SetCommState
|
Public Type DCBstructure
' DCB構造体の定義は以下の通り。
DCBlength As Long
' sizeof(DCB)
BaudRate As Long
' ◎current baud rate
Flags As Long
' ◎FlagsのBit Assignは以下の通り。0x000001011を推奨。
' fBinary :1 ' binary mode, no EOF check
' fParity :1 ' enable parity checking
' fOutxCtsFlow :1 ' CTS output flow control
' fOutxDsrFlow :1 ' DSR output flow control
' fDtrControl :2 ' DTR flow control type
' fDsrSensitivity :1 ' DSR sensitivity
' fTXContinueOnXoff :1 ' XOFF continues Tx
' fOutX :1 ' XON/XOFF out flow control
' fInX :1 ' XON/XOFF in flow control
' fErrorChar :1 ' enable error replacement
' fNull :1 ' enable null stripping
' fRtsControl :2 ' RTS flow control
' fAbortOnError :1 ' abort reads/writes on error
' fDummy2 :17 ' reserved
wReserved1 As Integer
' not currently used
XonLim As Integer
' transmit XON threshold
XoffLim As Integer
' transmit XOFF threshold
ByteSize As Byte
' ◎number of bits/byte, 4-8
Parity As Byte
' ◎0-4=no,odd,even,mark,space
StopBits As Byte
' ◎0,1,2 = 1, 1.5, 2
XonChar As Byte
' Tx and Rx XON character
XoffChar As Byte
' Tx and Rx XOFF character
ErrorChar As Byte
' error replacement character
EofChar As Byte
' end of input character
EvtChar As Byte
' received event character
wReserved2 As Integer
' reserved; do not use
End Type
' Comm Baud Rate indices ' [BaudRateに設定可能なボーレート]
Public Const CBR_110 = 110
' ○
Public Const CBR_300 = 300
' ○
Public Const CBR_600 = 600
' ○
Public Const CBR_1200 = 1200
' ○
Public Const CBR_2400 = 2400
' ○
Public Const CBR_4800 = 4800
' ○
Public Const CBR_9600 = 9600
' ○
Public Const CBR_14400 = 14400
' ○
Public Const CBR_19200 = 19200
' ○
Public Const CBR_38400 = 38400
' ○
Public Const CBR_56000 = 56000
' ○
Public Const CBR_57600 = 57600
' ○
Public Const CBR_115200 = 115200
' ○(NEC PC9821シリーズの最大値)
Public Const CBR_128000 = 128000
' ×(予約)
Public Const CBR_256000 = 256000
' ×(予約)
' DCB構造体のFlagsのfDtrControlに設定可能な数値
Public Const DTR_CONTROL_DISABLE = &H0
Public Const DTR_CONTROL_ENABLE = &H1
Public Const DTR_CONTROL_HANDSHAKE = &H2
' DCB構造体のFlagsのfRtsControlに設定可能な数値
Public Const RTS_CONTROL_DISABLE = &H0
Public Const RTS_CONTROL_ENABLE = &H1
Public Const RTS_CONTROL_HANDSHAKE = &H2
Public Const RTS_CONTROL_TOGGLE = &H3
|
◆COMMTIMEOUTS構造体
ReadFile及びWriteFile中で使用するタイムアウト条件をミリ秒単位で指定するための構造体です。使わない場合には0を指定します。
|
Public Type COMMTIMEOUTSstructure '
COMMTIMEOUTS構造体の定義は以下の通り。
ReadIntervalTimeout As Long ' ReadFile中での受信文字間の許容時間
(mSec) 未使用時は0
ReadTotalTimeoutMultiplier As Long ' ReadFile中での受信文字数×Multiplier
(mSec) 未使用時は0
ReadTotalTimeoutConstant As Long ' ReadFile中での受信許容時間
(mSec) 未使用時は0
WriteTotalTimeoutMultiplier As Long ' WriteFile中での送信文字数×Multiplier(mSec)
未使用時は0
WriteTotalTimeoutConstant As Long ' WriteFile中での送信許容時間
(mSec) 未使用時は0
End Type
|
●GetCommState
指定したハンドル番号hComのポートの現在の設定状態を指定したDCB構造体に読み込みます。従って、lpDCBには宣言済みのDCB構造体を指定しなければなりません。
|
'***********************************************************************
' 通信ポートのカレント状態をDCB構造体に取得する。
'***********************************************************************
Public Declare Function GetCommState Lib "kernel32" (ByVal hCom
As Long, ByRef lpDCB As DCBstructure) As Long
|
●SetCommState
指定したハンドル番号hComのポートの設定状態を指定したDCB構造体の値に基づいて変更します。
|
'***********************************************************************
' 通信ポートのカレント状態を指定したDCB構造体に従って設定する。
'***********************************************************************
Public Declare Function SetCommState Lib "kernel32" (ByVal hCom
As Long, ByRef lpDCB As DCBstructure) As Long
|
●BuildCommDCB
lpDefで指定された文字定数あるは文字変数の内容に従ってDCB構造体を作成し、指定したDCB構造体にその値を読み込みます。例えば、"115200,N,8,1"と指定すると、ボーレート115200bps、パリティーチェック無し、データ長8bits、ストップビット長1ビットになります。
●BuildCommDCBAndTimeouts
BuildCommDCBの機能に加え、TIMEOUTS構造体を作成します。
|
'***********************************************************************
' 通信ポートにおけるDCB構造体,及びCOMMTIMEOUTS構造体の構築設定。
'***********************************************************************
Public Declare Function BuildCommDCB Lib "kernel32" Alias "BuildCommDCBA"
(ByVal lpDef As String, ByRef lpDCB As DCBstructure) As Long
Public Declare Function BuildCommDCBAndTimeouts Lib "kernel32" Alias "BuildCommDCBAndTimeoutsA"
(ByVal lpDef As String, ByRef lpDCB As DCBstructure, ByRef
lpCommTimeouts As COMMTIMEOUTSstructure) As Long
|
●GetCommTimeouts
ハンドル番号hComで割り当てられているポートのタイムアウト条件を読み取り、指定したTIMEOUTS構造体に格納します。
●SetCommTimeouts
ハンドル番号hComで割り当てられたポートに指定したTIMEOUTS構造体の指定値のタイムアウト条件を設定します。
|
'***********************************************************************
' 通信ポートにおけるCOMMTIMEOUTS構造体の取得、設定。
'***********************************************************************
Public Declare Function GetCommTimeouts Lib "kernel32" (ByVal
hCom As Long, ByRef lpCommTimeouts As COMMTIMEOUTSstructure) As Long
Public Declare Function SetCommTimeouts Lib "kernel32" (ByVal hCom As
Long, ByRef lpCommTimeouts As COMMTIMEOUTSstructure) As Long
|
●GetCommMask
ハンドル番号hComに割り当て中のポートに設定されている通信イベント・マスクを指定変数に読み込む。
●SetCommMask
ハンドル番号hComに割り当て中のポートに対して指定された通信イベント・マスクを設定する。
●WaitCommEvent
ハンドル番号hComに割り当てられたポートにおいて指定された(マスクされていない)通信イベントが発生するまで待機する。lpOverlappedには0を設定する。
|
'***********************************************************************
' "通信イベントの取得"関連
'***********************************************************************
' GetCommMask 現在設定されているイベントマスクを取得する。
' SetCommMask イベントマスクを設定する。
' WaitCommEvent SetCommMaskによって設定されたイベントを待つ。
Public Declare Function GetCommMask Lib "kernel32" (ByVal hCom As
Long, ByRef lpEvtMask As Long) As Long
Public Declare Function SetCommMask Lib "kernel32" (ByVal hCom As Long,
ByVal dwEvtMask As Long) As Long
Public Declare Function WaitCommEvent Lib "kernel32" (ByVal hCom As
Long, ByRef lpEvtFlags As Long, ByVal lpOverlapped As Long) As Long
' EventMask及びEventFlagsのBit Assignを以下に記す。
Public Const EV_RXCHAR = &H1 '文字が受信された。
Public Const EV_RXFLAG = &H2 '特別なイベント文字(DCB構造体のEvtCharフィールドに設定されているもの)が受信された。
Public Const EV_TXEMPTY = &H4 '送信バッファが空になった。
Public Const EV_CTS = &H8 'CTS回線が変化した。
Public Const EV_DSR = &H10 'DSR回線が変化した。
Public Const EV_RLSD = &H20 'DCD回線が変化(RLSD)した。
Public Const EV_BREAK = &H40 'Breakが入力に送られた。
Public Const EV_ERR = &H80 'Line status
errorが検出された。
' CE_FRAME, CE_OVERRUN, 及びCE_EMPTYが考えられる。
Public Const EV_RING = &H100 'モデムが着信(Ring
signal)を感知した。
Public Const EV_PERR = &H200 ' Printer error
occured
Public Const EV_RX80FULL = &H400
'受信バッファが80%以上充たされた。
Public Const EV_EVENT1 = &H800 ' Provider specific
event 1
Public Const EV_EVENT2 = &H1000 ' Provider
specific event 2
|
●EscapeCommFunction
ハンドル番号hComに割り当てられたポートに対して指定の動作を実行する、あるいは試みる。
|
'***********************************************************************
' 指定されたオペレーションを実行する。
'***********************************************************************
Public Declare Function EscapeCommFunction Lib "kernel32" (ByVal
hCom As Long, ByVal nFunc As Long) As Long
Public Const SETXOFF = 1 ' Simulate XOFF received
Public Const SETXON = 2 ' Simulate XON received
Public Const SETRTS = 3 ' Set RTS(request-to-send)
high
Public Const CLRRTS = 4 ' Set RTS(request-to-send)
low
Public Const SETDTR = 5 ' Set DTR(data-terminal-ready)
high
Public Const CLRDTR = 6 ' Set DTR(data-terminal-ready)
low
Public Const RESETDEV = 7 ' 通信デバイスのリセットを試みる。(if
possible)
Public Const SETBREAK = 8 ' Set the device break
line
Public Const CLRBREAK = 9 ' Clear the device break
line
|
●SetCommBreak
ハンドル番号hComに割り当てられたポートからBreakを送出する。
●ClearCommBreak
ハンドル番号hComに割り当てられたポートから送出しているBreakを解除する。
|
'***********************************************************************
' 通信ポートからのBreak送出、及びその取り消し。
'***********************************************************************
Public Declare Function SetCommBreak Lib "kernel32" (ByVal hCom
As Long) As Long
Public Declare Function ClearCommBreak Lib "kernel32" (ByVal hCom As
Long) As Long
|
●PurgeComm
ハンドル番号hComに割り当てられたポートに対して処理のアボート(中止)やキューのクリアを行う。
|
'***********************************************************************
' 通信ポートにおけるPURGE設定。
'***********************************************************************
Public Declare Function PurgeComm Lib "kernel32" (ByVal hCom As
Long, ByVal dwFlags As Long) As Long
Public Const PURGE_TXABORT = &H1 ' 実施中の送信処理のアボート
Public Const PURGE_RXABORT = &H2 ' 実施中の受信処理のアボート
Public Const PURGE_TXCLEAR = &H4 ' 送信バッファのクリア(OutBufferCount
<= 0)
Public Const PURGE_RXCLEAR = &H8 ' 受信バッファのクリア (InBufferCount
<= 0)
|
◆COMSTAT構造体
ハンドル番号hComに対して割り当てられたポートの状態を取得するために用いる構造体。
|
Public Type COMSTATstructure '
COMSTAT構造体の定義を以下の通り。
Flags As Long
' fCtsHold :1 ' Tx waiting for CTS signal
' fDsrHold :1 ' Tx waiting for DSR signal
' fRlsdHold :1 ' Tx waiting for RLSD signal
' fXoffHold :1 ' Tx waiting, XOFF char rec'd
' fXoffSent :1 ' Tx waiting, XOFF char sent
' fEof :1 ' EOF character sent
' fTxim :1 ' character waiting for Tx
' fReserved :25 ' reserved
cbInQue As Long ' bytes in input buffer
cbOutQue As Long ' bytes in output buffer
End Type
|
●ClearCommError
ハンドル番号hComに対して割り当てられたポートに発生しているエラーをクリアするとともに、そのエラーコードを取得する。また、回線や通信バッファの状態を指定したCOMSTAT構造体に取得する。
受信キューに溜まっている受信データのバイト数や送信キューに溜まっている送信データのバイト数を知ることができる。
|
'***********************************************************************
' 通信ポートのERRORのクリア、及び回線、通信バッファの状態取得。
'***********************************************************************
Public Declare Function ClearCommError Lib "kernel32" (ByVal hCom
As Long, ByRef lpErrors As Long, ByRef lpStat As COMSTATstructure) As
Long
' Error Flags
Public Const CE_RXOVER = &H1 ' Receive
Queue overflow
Public Const CE_OVERRUN = &H2 ' Receive Overrun
Error
Public Const CE_RXPARITY = &H4 ' Receive Parity
Error
Public Const CE_FRAME = &H8 ' Receive Framing
error
Public Const CE_BREAK = &H10 ' Break Detected
Public Const CE_TXFULL = &H100 ' TX Queue is full
Public Const CE_PTO = &H200 ' LPTx Timeout
Public Const CE_IOE = &H400 ' LPTx I/O Error
Public Const CE_DNS = &H800 ' LPTx Device not
selected
Public Const CE_OOP = &H1000 ' LPTx Out-Of-Paper
Public Const CE_MODE = &H8000 ' Requested mode
unsupported
|
●TransmitCommChar
ハンドル番号で指定されるポートから送信キューの状態によらず、最優先で指定文字コードを強制的に出力する。
|
'***********************************************************************
' 通信ポートから最優先に1文字強制送出する。
'***********************************************************************
Public Declare Function TransmitCommChar Lib "kernel32" (ByVal
hCom As Long, ByVal cChar As Byte) As Long
|
◆COMMPROP構造体
ポートに対する物理的制約条件(仕様)を読み込むために使用する構造体。
|
Public Type COMMPROPstructure
wPacketLength As Integer ' packet size, in bytes
wPacketVersion As Integer ' packet version
dwServiceMask As Long ' services implemented
dwReserved1 As Long ' reserved
dwMaxTxQueue As Long ' max Tx bufsize, in bytes
dwMaxRxQueue As Long ' max Rx bufsize, in bytes
dwMaxBaud As Long ' max baud rate, in bps
dwProvSubType As Long ' specific provider type
dwProvCapabilities As Long ' capabilities
supported
dwSettableParams As Long ' changable parameters
dwSettableBaud As Long ' allowable baud rates
wSettableData As Integer ' allowable byte sizes
wSettableStopParity As Integer ' stop bits/parity
allowed
dwCurrentTxQueue As Long ' Tx buffer size, in
bytes
dwCurrentRxQueue As Long ' Rx buffer size, in
bytes
dwProvSpec1 As Long ' provider-specific data
dwProvSpec2 As Long ' provider-specific data
wcProvChar(1) As Integer ' provider-specific data
End Type
|
●GetCommProperties
ハンドル番号で割り当てられたポートの物理的制約条件(仕様)を指定したCOMPROP構造体に読み込む。
|
'***********************************************************************
' 通信ポートのプロパティを取得する。
'***********************************************************************
Public Declare Function GetCommProperties Lib "kernel32" (ByVal
hCom As Long, ByRef lpCommProp As COMMPROPstructure) As Long
|
●GetCommModemStatus
ハンドル番号で割り当てられたポートがモデムである場合にそのハードウェア状態を指定変数に読み込む。
|
'***********************************************************************
' 通信モデムの状態を取得する。
'***********************************************************************
Public Declare Function GetCommModemStatus Lib "kernel32" (ByVal
hCom As Long, ByRef lpModemStat As Long) As Long
Public Const MS_CTS_ON = &H10& 'MS_CTS_ON The CTS
(clear-to-send) signal is on.
Public Const MS_DSR_ON = &H20& 'MS_DSR_ON The DSR
(data-set-ready) signal is on.
Public Const MS_RING_ON = &H40& 'MS_RING_ON The
ring indicator signal is on.
Public Const MS_RLSD_ON = &H80& 'MS_RLSD_ON The
RLSD (receive-line-signal-detect) signal is on.
|
|
【使い方の例】 |
|
1)
定義の例
下記の例を使う場合の変数割り当ての事例です。
|
'***** 通信関連
Private hComm As Long ' RS232cポートのハンドル番号
Private CommNum As String ' RS232cポートのポート番号
Private Settings As String ' RS232cポートに対する通信設定
Private DCB As DCBstructure ' DCB構造体
Private COMSTAT As COMSTATstructure ' COMSTAT構造体
Private CommErrorCode As Long '
RS232cポートの通信エラー・コード
Private COMMTIMEOUTS As COMMTIMEOUTSstructure '
COMMTIMEOUTS構造体
Private RxQueueSize As Long '
Windows側に用意する受信キューのサイズ
Private TxQueueSize As Long '
Windows側に用意する送信キューのサイズ
Private RxBuf(512) As Byte ' アプリケーション側で使う受信バッファ
Private TxBuf(512) As Byte ' アプリケーション側で使う送信バッファ
|
2)
初期化の例
以下の手順でポートの初期化を行う。
a) セルからポート番号とポート設定条件を読み込む。
b) 指定ポート番号で送受信用ポートとしての使用開始を宣言し、ハンドル番号を取得する。
c) ハンドル番号hCommが正値でOpenすることができた場合には、
d) 受信キュー、送信キューサイズを指定する。
e) ポート指定条件Settingsに基づきDCB構造体を取得し、バイナリモード、ハンドシェーク無しでポートを設定する。
f) タイムアウト条件を設定する
|
CommNum = Sheet3.Cells(2, 4)
Settings = Sheet3.Cells(3, 4)
hComm = CreateFile(CommNum, GENERIC_READ Or GENERIC_WRITE, 0, 0,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
'
実在する"COM7"ポートの受信・送信での利用開始を宣言する。戻り値が-1の場合、実在しないか他のアプリで利用中を示す。
If hComm > 0 Then '
実際に"COM7"がOpenできた場合にはWindowsからhCommにハンドル番号が返される。
' 戻り値が負なら他のアプリケーションが使用中か、"COM7"が実在しないかのどちらかである。
RxQueueSize = 512
TxQueueSize = 512
SetupComm hComm, RxQueueSize, TxQueueSize '
Windows側に受信キュー(512バイト)と送信キュー(512バイト)を用意する。
BuildCommDCB Settings, DCB '
文字列Settingsに定義された条件のDCB構造体を作る。
DCB.Flags = DCB.Flags Or 1 '
通信モードをバイナリー(Binary Mode ON)に変更する。
DCB.Flags = DCB.Flags Or &H1010 ' ハンドシェーク線の状態をDTR
and RTS Enableに設定する。
SetCommState hComm, DCB ' DCB構造体に基づいてRS232Cポートを初期化する。
With COMMTIMEOUTS ' COMMTIMEOUTS構造体の定義は以下の通り。
. ReadIntervalTimeout = 1 ' ReadFile中での受信文字間の許容時間
(mSec) 未使用時は0
. ReadTotalTimeoutMultiplier = 0 ' ReadFile中での受信文字数×Multiplier
(mSec) 未使用時は0
. ReadTotalTimeoutConstant = 16 ' ReadFile中での受信許容時間
(mSec) 未使用時は0
. WriteTotalTimeoutMultiplier = 0 ' WriteFile中での送信文字数×Multiplier(mSec)
未使用時は0
. WriteTotalTimeoutConstant = 0 ' WriteFile中での送信許容時間
(mSec) 未使用時は0
End With
SetCommTimeouts hComm, COMMTIMEOUTS '
通信のタイムアウト条件の設定を行う。
Else
MsgBox "ハンドル番号が異常値を示しています。", vbOKOnly + vbCritical +
vbApplicationModal
End If
|
3)
送受信の例
送信データとループ・バックされたデータを比較する例を示します。詳細は右ソースリスト内のコメントに記載している通りです。
なお、Sleep関数を使う場合には予め
Public Declare Sub Sleep Lib "kernel32" (ByVal
dwMilliseconds As Long)
を宣言しておく必要があります。
|
' 配列TxBuf()に0x00から0xFFまでのASCII(文字)コードをセットする。
For i = 0 To 255
TxBuf(i) = i
Next i
WriteFile hComm, TxBuf(0), 128, j&, 0 '
TxBuf(0)からTxBuf(127)までの128バイトを送信する。
LP1: ClearCommError hComm, CommErrorCode, COMSTAT
' RS232Cポートの状態をCOMSTAT構造体に読み込む
If COMSTAT.cbInQue < 128 Then ' COMSTAT構造体を使って受信キューに128バイトの受信データが蓄積されるのを待つ
GoTo LP1
End If
ReadFile hComm, RxBuf(0), 128, j&, 0 '
RxBuf(0)を先頭に受信データを128バイト読み込む
For i = 0 To 127
If TxBuf(i) <> RxBuf(i) Then
MsgBox "Error :TxD=" + Right("0" + Hex(TxBuf(i)), 2) + " RxD=" +
Right("0" + Hex(RxBuf(i)), 2)
End If
Next i
Sleep 1000 '
Win32APIに用意された時間待ちルーチン。引数はミリ秒単位のLong型である。
WriteFile hComm, TxBuf(128), 128, j&, 0 '
TxBuf(128)からTxBuf(255)までの128バイトを送信する。
LP2: ClearCommError hComm, CommErrorCode, COMSTAT
' RS232Cポートの状態をCOMSTAT構造体に読み込む
If COMSTAT.cbInQue < 128 Then ' COMSTAT構造体を使って受信キューに128バイトの受信データが蓄積されるのを待つ
GoTo LP2
End If
ReadFile hComm, RxBuf(128), 128, j&, 0 '
RxBuf(128)を先頭に受信データを128バイト読み込む
For i = 128 To 255
If TxBuf(i) <> RxBuf(i) Then
MsgBox "Error :TxD=" + Right("0" + Hex(TxBuf(i)), 2) + " RxD=" +
Right("0" + Hex(RxBuf(i)), 2)
End If
Next i
|
4)
通信終了の例
ハンドル番号で指定したポートの利用を終了します。
|
CloseHandle hComm '
RS232Cポートを開放する。
hComm = -1
|