串口编程

时间:2010-08-14 07:10:07

标签: vb6

我的要求是检测任何通信设备连接的端口号

我们如何在包中添加任何通信设备的驱动程序,这些驱动程序可以与我的软件包的安装一起安装

1 个答案:

答案 0 :(得分:1)

Option Explicit
'******************************************************************************
' Description: Scans machine using the WIN32 API for all available comm hardware
' Usage:    main program calls the 'CommSettings' sub, passing the
'           name of the communications control and a combobox name.
'******************************************************************************

Dim CommCntrl             As Control                                  ' the communications control
Dim cmboPort              As Control                                  ' combobox to populate
Dim bNoComm               As Boolean

Private Const MAX_COMM = 16                                           ' 32 max port # to check

Private Const GENERIC_READ = &H80000000
Private Const GENERIC_WRITE = &H40000000
Private Const OPEN_EXISTING = 3
Private Const FILE_FLAG_OVERLAPPED = &H40000000
Private Const INVALID_HANDLE_VALUE = -1

Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" _
                                    (ByVal lpFileName As String, _
                                     ByVal dwDesiredAccess As Long, _
                                     ByVal dwShareMode As Long, _
                                     ByVal lpSecurityAttributes As String, _
                                     ByVal dwCreationDisposition As Long, _
                                     ByVal dwFlagsAndAttributes As Long, _
                                     ByVal hTemplateFile As String) As Long

Private Declare Function CloseHandle Lib "kernel32" ( _
                                     ByVal hObject As Long) As Long


Public Sub GetPorts(serialCntrl As Control, comboBox As Control)
    '******************************************************************************
    ' Usage:    Pass the name of the communications control, a combo box, and the
    '           current com port setting in the calling routine.
    '******************************************************************************

    Dim iCntr             As Integer                                  ' loop counter
    Dim hRet              As Long                                     ' api return value
    Dim sCom              As String                                   ' comm port name

    On Error Resume Next

    Set cmboPort = comboBox

    Set CommCntrl = serialCntrl
    Err = 0

    cmboPort.Clear

    ' Close the port if it's open
    If CommCntrl.PortOpen = True Then
        CommCntrl.PortOpen = False
        DoEvents
    Else
        bNoComm = True
    End If

    ' Scan for all possible hardware so we can display all available ports
    ' in the combo box. Dynamically adjusts for PC's with addin cards
    For iCntr = 1 To MAX_COMM
        ' try to open the port.
        ' \\.\ required for ports > 9, works for all ports
        sCom = "\\.\Com" & CStr(iCntr) & vbNullChar
        hRet = CreateFile(sCom, GENERIC_READ Or _
                                GENERIC_WRITE, 0, vbNullString, OPEN_EXISTING, _
                          FILE_FLAG_OVERLAPPED, vbNullString)

        If hRet <> INVALID_HANDLE_VALUE Then
            hRet = CloseHandle(hRet)
            cmboPort.AddItem Format$(iCntr)
            Debug.Print iCntr
        Else
            ' dll error 5 = already open
            ' dll error 2 = no harware
            If Err.LastDllError = 5 Then
                cmboPort.AddItem Format$(iCntr) & " - Busy"
            End If
        End If
    Next

End Sub