Vb.net 查找设备连接的串行端口

Vb.net 查找设备连接的串行端口,vb.net,serial-port,Vb.net,Serial Port,我开始用针垫工作了。 我需要我的程序在没有用户交互的情况下找到连接pinpad的端口 我试过: Dim searcher As New ManagementObjectSearcher("root\cimv2","SELECT * FROM Win32_SerialPort") For Each queryObj As ManagementObject In searcher.Get() MsgBox(queryObj("Name")) Ne

我开始用针垫工作了。 我需要我的程序在没有用户交互的情况下找到连接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打印机”)

你知道我怎样才能得到我需要的端口吗


提前感谢

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

My.Computer.Ports.SerialPortNames


枚举并循环所有串行端口。然后,一次一个尝试打开每个,并向您知道它响应的设备发送命令。大多数设备都有某种心跳或保持活动状态的消息,它们将对此做出响应。无论您在哪个端口上获得响应,都是您需要使用的端口。

我想指出两点:

1:这是我用来解决这个问题的一个解决方案(效率修正将不胜感激) 我使用这个方法来确定连接了哪个端口vx805 verifone pin焊盘(具有唯一的设备id):

末级

2:希望能在这方面采取更多行动:

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


我想看一个代码示例,说明如何向pinpad发送心跳检查

连接到串行端口的pinpad硬件的品牌和型号是什么?Ingenico iPP320。我用第二种方法得到的“友好名称”是“Ingenico控制设备”是COM4某种USB到串行转换器或附加串行端口卡?我正在将我的pinpad连接到普通USB端口。我“知道”那是COM4,因为我正在用我的.Computer.ports.SerialPortNames读取所有端口。我尝试了这个解决方案,但问题是在几个地方会有很多pinpad,我不知道当机器出现问题时是否会有问题,例如,同时连接10个不同的设备。一台机器将连接多个pinpad?如果是这样的话,是否有某种设备标识符可以通过串行接口查询?不会同时有多个pinpad,因此我使用您的解决方案,它成功了。谢谢我害怕通过一个端口一个端口地发送消息来创建一个永恒的循环或一些奇怪的东西,但它工作得很好。
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