2013-12-18 81 views
4

我开始使用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打印机”这样的名称)

如何获得我需要的端口?提前

+0

是什么品牌和型号您连接到串行端口的引脚板硬件的位置? –

+0

Ingenico iPP320。 我用第二种方法获得的'友好名称'是'Ingenico控制设备' – DenLun

+0

COM4是某种USB串口转换器还是附加串口卡? –

回答

3

由于基于它听起来像你的设备的意见是具有导致它似乎是(模拟)的串行端口连接设备的驱动程序的USB设备。在这种情况下,我会用:

My.Computer.Ports.SerialPortNames

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

+0

我尝试了这个解决方案,但事情是在几个地方会有很多pinpads,我不知道在机器有没有问题时,例如,有10个不同的设备连接在同时。 – DenLun

+0

一台机器会连接多个pinpad吗?如果是这样,是否有某种设备标识符可以通过串行接口查询? –

+0

在同一时间不会有多个pinpad,所以我使用你的解决方案,它的工作。谢谢! 我害怕通过端口发送消息端口来创建类似于永恒循环或奇怪的东西,但它工作正常。 – DenLun

0

我想点2个事项:

1:这里为i用于此问题(efficiancy修正可以理解) 我用这个soution我用找出哪个端口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:很想上更clarifiaction:

然后,每次尝试打开一个,然后发送一条命令给您知道它响应的设备。大多数设备拥有某种心跳或保持活动消息,他们将到

回应我很想看到的代码示例如何发出这样一个心跳检查的密码键盘

相关问题