|
|
![]() |
|
||
|
|
|||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||
| Visual Basic System Services ConfigurePort: Determine Available COM Ports with the MSCOMM Control |
||
| Posted: | Wednesday June 02, 2004 | |
| Updated: | Monday December 26, 2011 | |
| Applies to: | VB4-32, VB5, VB6 | |
| Developed with: | VB6, Windows XP | |
| OS restrictions: | None | |
| Author: | VBnet - Randy Birch | |
Related: |
Using CreateFile to Determine Available COM Port | |
| Prerequisites |
| None. |
|
|
The CreateFile
version of this code provides developers with the ability to eliminate
the MSCOMM control from their application distribution when all that is
required is code to determine the COM ports available.
This demo duplicates the CreateFile API demo, substituting MSCOMM controls for all activities. Like the CreateFile method this code also utilizes two key functions. GetInstalledCOMPorts() passes a series of port numbers (1 through 16 in this demo) to the worker COMCheckPort function, which uses the MSCOMM control to attempt to open the port. If the port is in use the error trap fires, and the function returns False. If the port can be successfully opened, the port is tested by issuing an open and close call, and if both succeed the function returns True indicating the port is available and ready for use. The results of each call are entered to a list indicating which ports are available for use. GetFirstAvailableCOMPort() also uses COMCheckPort but this routine exits once the first available port has been determined. For demo purposes the result is displayed in the list box as well. In order to provide the functionality of the API Open COM/Close COM buttons, a second MSCOMM control is required on the form. The code also includes the same ConfigurePort API demo showing how to present the user with Windows' standard dialog to allow customization of the COM port baud rate, bits, parity, stop bits and flow control, as well as restore the default settings. |
| BAS Module Code |
| None. |
|
|
| Form Code |
|
|
| To a form, add a list box (List1), five command buttons (Command1-Command5), two option buttons (Option1, Option2) and two mscomm controls (MSComm1, MSComm2). Add the following code: |
|
|
Option Explicit '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Copyright ©1996-2011 VBnet/Randy Birch, All Rights Reserved. ' Some pages may also contain other copyrights by the author. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Distribution: You can freely use this code in your own ' applications, but you may not reproduce ' or publish this code on any web site, ' online service, or distribute as source ' on any media without express permission. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Declare Function ConfigurePort Lib "winspool.drv" _
Alias "ConfigurePortA" _
(ByVal pName As Any, _
ByVal hwnd As Long, _
ByVal pPortName As String) As Long
Private Sub Form_Load()
Command1.Caption = "Get Installed COM Ports"
Command2.Caption = "Get First Available Port (API)"
Command3.Caption = "Configure Port Dialog"
Command4.Caption = "Open COM1"
Command5.Caption = "Close COM1"
Option1.Caption = "COM1:"
Option2.Caption = "COM2:"
Option1.Value = True
End Sub
Private Sub Form_Unload(Cancel As Integer)
If MSComm2.PortOpen = True Then
MSComm2.PortOpen = False
End If
End Sub
Private Sub Command1_Click()
List1.Clear
Call GetInstalledCOMPorts(List1)
End Sub
Private Sub Command2_Click()
Dim nPort As Long
List1.Clear
nPort = GetFirstAvailableCOMPort()
If nPort > 0 Then
List1.AddItem "COM" & nPort & " is the first available port"
End If
End Sub
Private Sub Command3_Click()
Dim Port As Long
Dim result As Boolean
List1.Clear
Port = GetSelectedOptionIndex() + 1
If COMConfigPort(Port) = 1 Then
List1.AddItem "COM" & Port & " - User pressed OK"
Else
List1.AddItem "COM" & Port & " - User pressed Cancel"
End If
End Sub
Private Sub Command4_Click()
Call OpenPort(1)
Command4.Enabled = MSComm2.PortOpen = False
End Sub
Private Sub Command5_Click()
If MSComm2.PortOpen = True Then
MSComm2.PortOpen = False
End If
Command4.Enabled = MSComm2.PortOpen = False
End Sub
Private Function COMCheckPort(Port As Long) As Boolean
'Returns false if port cannot be opened or does not exist
'Returns true if port is available and can be opened
'Handle all errors
On Error GoTo OpenCom_Error
'Set port number for test
MSComm1.CommPort = Port
If MSComm1.PortOpen = True Then
COMCheckPort = False
Exit Function
Else
'Test the port by opening and closing it
MSComm1.PortOpen = True
MSComm1.PortOpen = False
COMCheckPort = True
Exit Function
End If
OpenCom_Error:
COMCheckPort = False
End Function
Private Function COMConfigPort(Port As Long) As Boolean
Dim sPort As String
If Val(Port) > 0 Then
sPort = "COM" & Port & ":"
If Right$(sPort, 1) <> ":" Then
sPort = sPort & ":"
End If
'Configure the port on the local machine.
'This API can also be used to configure
'COM and LPTP ports on remote machines
'and servers by passing the machine name
'as the first parameter in the format
' "\\servername". ByVal vbNullString or
'ByRef 0& can be passed to configure the
'local machine. The hwnd parameter specified
'the window that owns the dialog - it will
'appear modal to the specified window.
'Returns 1 if OK is pressed, or 0 if Cancelled.
'
'This call does not return the values set or
'changed in the dialog, nor does it indicate
'whether the user pressed Apply prior to
'pressing OK or Cancel. This is important
'in so far as changes made and Applied are
'set even if the dialog is cancelled.
COMConfigPort = ConfigurePort(ByVal "\\vbnetdev", Me.hwnd, sPort)
End If
End Function
Private Function GetFirstAvailableCOMPort() As Long
Dim Port As Long
'Find first port not already in use.
'Return either the port number if
'available, or zero otherwise
For Port = 1 To 16
If COMCheckPort(Port) = True Then
GetFirstAvailableCOMPort = Port
Exit Function
End If
Next Port
'No useable port was found
GetFirstAvailableCOMPort = 0
End Function
Private Function GetInstalledCOMPorts(lst As ListBox) As Long
Dim Port As Long
'simply loop through a range of
'possible ports and pass to the
'COMCheckPort function
For Port = 1 To 16
If COMCheckPort(Port) Then
lst.AddItem "COM" & Port & " available"
Else
lst.AddItem "COM" & Port & " (not available or no such port)"
End If
Next
End Function
Private Function GetSelectedOptionIndex() As Long
'returns the selected item index from
'a set of option buttons. Use in place
'of multiple If...Then statements!
'To add more option buttons to this function
'just append them to the test condition,
'setting the multiplier to the next negative
'value (eg Option3.Value * -2, Option4.Value * -3)
'Also see GetSelectedOptionIndex in the Core
'routines for a control array method.
GetSelectedOptionIndex = Option1.Value * 0 Or _
Option2.Value * -1
End Function
Private Function OpenPort(Port As Long) As Boolean
'Handle all errors
On Error GoTo OpenPort_Error
'Set port number for test
MSComm2.CommPort = Port
If MSComm2.PortOpen = True Then
OpenPort = False
Exit Function
Else
'Test the port by opening and closing it
MSComm2.PortOpen = True
OpenPort = True
Exit Function
End If
OpenPort_Error:
OpenPort = False
End Function
|
| Comments |
|
|
|
|
|
|||||
|
|||||
|
|
|||||
|
Copyright ©1996-2011 VBnet and Randy Birch. All Rights Reserved. |
![]() |