You do not actually need to check the availability of the COM ports, as you get an Err 8002. Invalid port number Error, which you can detect and display to the user. However, using this method, you can display a drop down to the user, listing all the available COM ports, rather than the 16 possible COM ports, most of which are actually unavailable. Firstly, copy the following code into a module in your project.
'// API Declarations
Public 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
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As
Long) As Long
'// API Structures
Public Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
'// API constants
Public Const FILE_SHARE_READ = &H1
Public Const FILE_SHARE_WRITE = &H2
Public Const OPEN_EXISTING = 3
Public Const FILE_ATTRIBUTE_NORMAL = &H80
'// Return TRUE if the COM exists, FALSE if the COM does not exist
Public Function COMAvailable(COMNum As Integer) As Boolean
Dim hCOM As Long
Dim ret As Long
Dim sec As SECURITY_ATTRIBUTES
'// try to open the COM port
hCOM = CreateFile("\.\COM" & COMNum &
"", 0, FILE_SHARE_READ + _
FILE_SHARE_WRITE, sec, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0)
If hCOM = -1 Then
COMAvailable = False
Else
COMAvailable = True
'// close the COM port
ret = CloseHandle(hCOM)
End If
End Function
Then, use the code below to go through all the possible COM ports, and find if they are available or not. This code presumes that you have a Combo box named cboComm.
Private Sub ListComPorts()
Dim i As Integer
cboComm.Clear
For i = 1 To 16
If COMAvailable(i) Then
cboComm.AddItem i
End If
Next
cboComm.ListIndex = 0
End Sub
Comments