Option Explicit Type SECURITY_ATTRIBUTES nLength As Long lpSecurityDescriptor As Long bInheritHandle As Boolean End Type Type DCB DCBlength As Long BaudRate As Long fBinary As Long fParity As Long fOutxCtsFlow As Long fOutxDsrFlow As Long fDtrControl As Long fDsrSensitivity As Long fTXContinueOnXoff As Long fOutX As Long fInX As Long fErrorChar As Long fNull As Long fRtsControl As Long fAbortOnError As Long fDummy2 As Long wReserved As Integer XonLim As Integer XoffLim As Integer ByteSize As Byte Parity As Byte StopBits As Byte XonChar As Byte XoffChar As Byte ErrorChar As Byte EofChar As Byte EvtChar As Byte End Type Type COMMTIMEOUTS ReadIntervalTimeout As Long ReadTotalTimeoutMultiplier As Long ReadTotalTimeoutConstant As Long WriteTotalTimeoutMultiplier As Long WriteTotalTimeoutConstant As Long End Type Type COMSTAT fCtsHold As Long fDsrHold As Long fRlsdHold As Long fXoffHold As Long fXoffSent As Long fEof As Long fTxim As Long fReserved As Long cbInQue As Long cbOutQue As Long End Type Type OVERLAPPED Internal As Long InternalHigh As Long offset As Long OffsetHigh As Long hEvent As Long End Type Public Const OPEN_EXISTING = 3 Public Const READ_CONTROL = &H20000 Public Const FILE_READ_DATA = (&H1) Public Const FILE_READ_ATTRIBUTES = (&H80) Public Const FILE_READ_EA = (&H8) Public Const SYNCHRONIZE = &H100000 Public Const FILE_WRITE_DATA = (&H2) Public Const FILE_WRITE_ATTRIBUTES = (&H100) Public Const FILE_WRITE_EA = (&H10) Public Const FILE_APPEND_DATA = (&H4) Public Const STANDARD_RIGHTS_READ = (READ_CONTROL) Public Const STANDARD_RIGHTS_WRITE = (READ_CONTROL) Public Const FILE_GENERIC_READ = (STANDARD_RIGHTS_READ Or FILE_READ_DATA Or FILE_READ_ATTRIBUTES Or FILE_READ_EA Or SYNCHRONIZE) Public Const FILE_GENERIC_WRITE = (STANDARD_RIGHTS_WRITE Or FILE_WRITE_DATA Or FILE_WRITE_ATTRIBUTES Or FILE_WRITE_EA Or FILE_APPEND_DATA Or SYNCHRONIZE) Public Const CBR_9600 = 9600 Public Const ONESTOPBIT = 0 Public Const NOPARITY = 0 Public Const GENERIC_READ = &H80000000 Public Const GENERIC_WRITE = &H40000000 Public Declare Function CreateFile Lib "Kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long Public Declare Function CloseHandle Lib "Kernel32" (ByVal hObject As Long) As Long Public Declare Function GetCommState Lib "Kernel32" (ByVal nCid As Long, lpDCB As DCB) As Long Public Declare Function SetCommState Lib "Kernel32" (ByVal hCommDev As Long, lpDCB As DCB) As Long Public Declare Function SetCommTimeouts Lib "Kernel32" (ByVal hFile As Long, lpCommTimeouts As COMMTIMEOUTS) As Long Public Declare Function ClearCommError Lib "Kernel32" (ByVal hFile As Long, lpErrors As Long, lpStat As COMSTAT) As Long Public Declare Function ReadFile Lib "Kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, ByRef lpNumberOfBytesRead As Long, ByVal lpOverlapped As Long) As Long Declare Function GetLastError Lib "Kernel32" () As Long Sub SerialTest() Dim overlapStruct As OVERLAPPED Dim status As Boolean Dim result, commError As Long Dim comStatus As COMSTAT Dim comPortHandle As Long Dim dcbSerialParams As DCB Dim timeouts As COMMTIMEOUTS Dim k As Long Dim readData() As Byte Dim bytesRead, bytesReadTotal As Long Dim chipId As String Dim errorCode As Long Dim chipsRead As Long ' Open COM port. comPortHandle = CreateFile("COM3", GENERIC_READ Or GENERIC_WRITE, 0, Null, OPEN_EXISTING, 0, 0) If comPortHandle = Null Then Call MsgBox("Cannot open COM port") End If On Error GoTo CleanUp ' Close port if anything goes wrong. ' Set COM port parameters. dcbSerialParams.DCBlength = LenB(dcbSerialParams) status = GetCommState(comPortHandle, dcbSerialParams) If status = False Then Call MsgBox("Cannot get COM port status data.") GoTo CleanUp End If dcbSerialParams.BaudRate = CBR_9600 dcbSerialParams.ByteSize = 8 dcbSerialParams.StopBits = ONESTOPBIT dcbSerialParams.Parity = NOPARITY status = SetCommState(comPortHandle, dcbSerialParams) If status = False Then Call MsgBox("Cannot set COM port status data.") GoTo CleanUp End If ' Set time-out values. timeouts.ReadIntervalTimeout = 50 timeouts.ReadTotalTimeoutMultiplier = 1 timeouts.ReadTotalTimeoutConstant = 10 timeouts.WriteTotalTimeoutConstant = 0 timeouts.WriteTotalTimeoutMultiplier = 0 status = SetCommTimeouts(comPortHandle, timeouts) If status = False Then Call MsgBox("Cannot set COM time-out values.") GoTo CleanUp End If ' Read tags. chipsRead = 0 While chipsRead < 10 bytesReadTotal = 0 Do readData() = "InsertSomeUsefulInformationHere" status = ReadFile(comPortHandle, readData(0), 12 - bytesReadTotal, bytesRead, 0&) bytesReadTotal = bytesReadTotal + bytesRead DoEvents Loop While bytesReadTotal < 12 chipId = "" For k = 0 To 7 chipId = chipId + Chr$(readData(k)) Next k Application.ActiveSheet.Cells(chipsRead + 1, 1) = chipId chipsRead = chipsRead + 1 Wend CleanUp: Call CloseHandle(comPortHandle) End Sub