我想列举一下本机COM口的状态,或者取所有的已使用中的COM端口号,该怎么做?还有,如果一个COM端口已经被使用,
那么        On Error GoTo Err:
        MSComm1.CommPort = i   
还是会终端程序报错的,
提示:
实时错误 '8005'
端口已经打开,该怎么绕开?

解决方案 »

  1.   

    On Error GoTo ErrHandler
            MSComm1.CommPort = i ErrHandler:
            If Err.Number = 8005 Then
               Debug.Print "COM" & i & " in use"
               Resume Next
            Else
               MsgBox "Realtime error: " & Err.Number & vbCrLf & Err.Description
            End If
      

  2.   

    On Error GoTo ErrHandler
    并不能避开提示:
    实时错误 '8005'
    端口已经打开
    跟我的On Error GoTo Err 
    效果是一样的,程序还是报错结束。
    我想把端口一直遍历下去,直到找到我所需要的。
      

  3.   

    呵呵,这个问题可以这样:
    一个listbox(用于查看结果),一个按钮,一个 MSComm:Private Sub Command1_Click()
        List1.Clear
        Dim i As Long, j As Long
        For i = 1 To 16
                MSComm1.CommPort = i
                On Error Resume Next
                MSComm1.PortOpen = True
                If Err.Number = 0 Then
                      List1.AddItem "串口" + CStr(i) + "可以使用"
                  Else
                      List1.AddItem "试图打开串口" + CStr(i) + "时,发生错误,错误描述为:" + Err.Description
                      MSComm1.PortOpen = False
                      Err.Clear
                End If
        Next i
       
    End Sub要用On Error Resume Next语句,使程序发生错误时也能向下执行
      

  4.   

    用On Error GoTo ErrHandler之类的话,也可以,不过需要封装一个额外的函数,就像这样:
    Option ExplicitPrivate Sub Command1_Click()
        List1.Clear
        Dim i As Long, j As Long
        Dim s As String
        For i = 1 To 16
            If mtest(i, s) Then
                List1.AddItem "串口" + CStr(i) + "可以使用"
            Else
               List1.AddItem "试图打开串口" + CStr(i) + "时,发生错误,错误描述为:" + s
            End If
        Next
    End Sub
    Private Function mtest(ByVal i As Long, ErrDescription As String) As Boolean
        On Error GoTo ErrHandler
        MSComm1.CommPort = i
        MSComm1.PortOpen = True
        ErrDescription = "没有错误发生" 'ErrDescription为输出参数
        mtest = True '可以使用
        Exit Function
    ErrHandler:
       ErrDescription = Err.Description
       mtest = False '不可以使用
    End Function
      

  5.   

    用wmi吧,简单方便,不会报错:Private Sub Command17_Click()
    On Error Resume Next
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set colItems = objWMIService.ExecQuery("Select * from Win32_SerialPortConfiguration", , 48)
    For Each objItem In colItems
        Debug.Print "Name: " & objItem.Name
        Debug.Print "Description: " & objItem.Description
        Debug.Print "isbusy: " & objItem.isbusy
    Next
    Debug.Print "========================================="
    End Sub