查找设备连接的串行端口

时间:2013-12-18 01:22:13

标签: vb.net serial-port

我开始使用pinpad。 我需要我的程序找到pinpad连接的端口而无需用户交互。

我尝试过:

Dim searcher As New ManagementObjectSearcher("root\cimv2","SELECT * FROM Win32_SerialPort")

        For Each queryObj As ManagementObject In searcher.Get()
          MsgBox(queryObj("Name"))
        Next

但这只给我“COM1”和“COM2”作为答案(我的设备连接到COM4)

Dim searcher As New ManagementObjectSearcher("root\cimv2", "SELECT * FROM Win32_PnPEntity WHERE ConfigManagerErrorCode = 0")

        For Each queryObj As ManagementObject In searcher.Get()
            MsgBox(queryObj("Name"))
        Next

有了这个,我可以看到我的设备友好名称,但我不知道如何获得端口(我收到像'HP打印机'这样的名字)

知道如何获得我需要的端口?

提前致谢

2 个答案:

答案 0 :(得分:3)

根据评论,听起来您的设备是USB设备,其驱动程序使其看起来像是(模拟)串行端口连接设备。在那种情况下,我会使用:

My.Computer.Ports.SerialPortNames

枚举并循环所有串口。然后,一次一个尝试打开每个并向您知道它响应的设备发送命令。大多数设备都有某种心跳或保持活跃的信息,他们会响应。无论您获得响应的端口是您需要使用的端口。

答案 1 :(得分:0)

我想指出两件事:

1:这是我用于此问题的解决方案(效率修正将不胜感激) 我用这个方法来解决连接vx805 verifone针垫的端口(具有唯一的设备ID):

Friend Class pinPadComLocater

Private Shared com As String
Private Const PNPDeviceID = "VID_11CA&PID_0220"
Private Const scope = "root\cimv2"
Public ReadOnly pinPadCom As String = Nothing


Sub New()
    If isVX805PinPadConnected() Then
        pinPadCom = com
        Output.mainLog(Output.pinpadLocationMsg + com)
    Else
        Output.mainLog(Output.pinpadNotFoundMsg)
    End If

End Sub

Private Shared Function queryCom(port As String) As Boolean
    Dim query = "SELECT * FROM Win32_PnPEntity WHERE ClassGuid=""{4d36e978-e325-11ce-bfc1-08002be10318}"" AND DeviceID LIKE  ""%" + PNPDeviceID + "%"" AND Caption LIKE ""%" + port + "%"""
    Dim resp = New ManagementObjectSearcher(scope, query).Get
    If resp.Count = 1 Then Return True  
    For Each queryObj As ManagementObject In resp
        For Each prop In queryObj.Properties 'print all data for development purposes
            Try
                Console.writeline(prop.Name + " : " + queryObj(prop.Name).ToString)
                catch ex As Exception
            End Try
        Next
    Next
    Return False
End Function
Private Shared Function isVX805PinPadConnected() As Boolean
    For Each port In My.Computer.Ports.SerialPortNames
        Try
            If queryCom(port) Then
                com = port
                Return True
            End If
        Catch err As ManagementException
            Throw New ConstraintException("An error occurred while querying for WMI data: " & err.Message)
        End Try
    Next
    Throw New ConstraintException("Pin Pad Com Port could not be located")
    Return False
End Function

结束班

2:会对此更加澄清:

  

然后,一次尝试打开每个并向您知道它响应的设备发送命令。大多数设备都有某种心跳或保持活动信息,他们会响应

我很想看到如何将这样的心跳检查发送到pinpad的代码示例