www.pudn.com > usbhidio2.rar > UsbCommunication.bas


Attribute VB_Name = "USBCommunication" 
Option Explicit 
 
Dim Capabilities As HIDP_CAPS 
Dim DataString As String 
Dim DetailData As Long 
Dim DeviceAttributes As HIDD_ATTRIBUTES 
Dim DevicePathName As String 
Dim DeviceInfoSet As Long 
Dim ErrorString As String 
Dim EventObject As Long 
Public HIDHandle As Long 
Dim HIDOverlapped As OVERLAPPED 
Dim IncreaseOfPacket As Integer 
Dim LastDevice As Boolean 
Dim UsefulMember As Byte 
Public MyDeviceDetected As Boolean 
Dim MyDeviceInfoData As SP_DEVINFO_DATA 
Dim MyDeviceInterfaceDetailData As SP_DEVICE_INTERFACE_DETAIL_DATA 
Dim MyDeviceInterfaceData As SP_DEVICE_INTERFACE_DATA 
Dim Needed As Long 
Dim DetailDataBuffer() As Byte 
Dim OutputReportData(64) As Byte 
Dim InputReportData() As Byte 
Dim PreparsedData As Long 
Public ProductInformation(3) As ProductSpec_typ 
Public ReadHandle As Long 
Public Result As Long 
Dim Security As SECURITY_ATTRIBUTES 
 
 
Dim Timeout As Boolean 
 
 
 
Public Function FindTheHid() As Boolean 
 
Dim Count As Integer 
Dim GUIDString As String 
Dim HidGuid As GUID 
Dim Buffer(100) As Byte 
Dim ProductName As String 
Dim SerialNumber As String 
Dim MemberIndex As Long 
 
 
LastDevice = False 
MyDeviceDetected = False 
 
Security.lpSecurityDescriptor = 0 
Security.bInheritHandle = True 
Security.nLength = Len(Security) 
 
Result = HidD_GetHidGuid(HidGuid)                  '取得HID类别的GUID 
 
DeviceInfoSet = SetupDiGetClassDevs _ 
    (HidGuid, _ 
    vbNullString, _ 
    0, _ 
    (DIGCF_PRESENT Or DIGCF_DEVICEINTERFACE)) '传回所有已经连接并检测过的HID,包含其信息的结构数组的地址 
 
'DataString = GetDataString(DeviceInfoSet, 32) 
 
MemberIndex = 0 
UsefulMember = 0 
 
Do 
    ProductName = "" 
    SerialNumber = "" 
    MyDeviceInterfaceData.cbSize = LenB(MyDeviceInterfaceData) 
    Result = SetupDiEnumDeviceInterfaces _ 
        (DeviceInfoSet, _ 
        0, _ 
        HidGuid, _ 
        MemberIndex, _ 
        MyDeviceInterfaceData)   '读取识别一个HID接口的结构的指针 
     
    If Result = 0 Then 
       LastDevice = True 
    End If 
         
    If Result <> 0 Then 
        MyDeviceInfoData.cbSize = Len(MyDeviceInfoData) 
        Result = SetupDiGetDeviceInterfaceDetail _ 
           (DeviceInfoSet, _ 
           MyDeviceInterfaceData, _ 
           0, _ 
           0, _ 
           Needed, _ 
           0) 
         
        DetailData = Needed 
             
        MyDeviceInterfaceDetailData.cbSize = _ 
            Len(MyDeviceInterfaceDetailData) 
 
        ReDim DetailDataBuffer(Needed) 
        Call RtlMoveMemory _ 
            (DetailDataBuffer(0), _ 
            MyDeviceInterfaceDetailData, _ 
            4) 
     
        Result = SetupDiGetDeviceInterfaceDetail _ 
           (DeviceInfoSet, _ 
           MyDeviceInterfaceData, _ 
           VarPtr(DetailDataBuffer(0)), _ 
           DetailData, _ 
           Needed, _ 
           0) '传回一个结构,此结构的DevicePath成员是一个设备路径,应用此路径来开启与该设备的通行 
               
        DevicePathName = CStr(DetailDataBuffer()) 
        DevicePathName = StrConv(DevicePathName, vbUnicode) 
        DevicePathName = Right$(DevicePathName, Len(DevicePathName) - 4) 
     
        HIDHandle = CreateFile _ 
            (DevicePathName, _ 
            GENERIC_READ Or GENERIC_WRITE, _ 
            (FILE_SHARE_READ Or FILE_SHARE_WRITE), _ 
            Security, _ 
            OPEN_EXISTING, _ 
            0&, _ 
            0) '开启一个HID设备,取得设备的代号,使用设备的代号与设备交换数据。代号存在HIDHandle,将来存在ReadHandle中 
 
        DeviceAttributes.Size = LenB(DeviceAttributes) 
        Result = HidD_GetAttributes _ 
            (HIDHandle, _ 
            DeviceAttributes) '取得一个包含厂商和产品ID以及产品版本号码的结构指针 
             
        If HidD_GetProductString(HIDHandle, VarPtr(Buffer(0)), UBound(Buffer)) Then 
           For Count = 0 To 82 Step 2                         '42 Byte 
               ProductName = ProductName & Chr(Buffer(Count)) 
           Next Count 
        End If 
         
        If HidD_GetSerialNumberString(HIDHandle, VarPtr(Buffer(0)), UBound(Buffer)) Then 
           For Count = 0 To 30 Step 2                        '16 Byte 
               SerialNumber = SerialNumber & Chr(Buffer(Count)) 
           Next Count 
        End If 
         
        'DeviceAttributes.VersionNumber = DeviceAttributes.VersionNumber 
       If (DeviceAttributes.VendorID = MyVendorID) And _ 
          (DeviceAttributes.ProductID = MyProductID) And _ 
          (ProductName = DeviceName) Then 
                MyDeviceDetected = True '判断设备是否连接上 
                 
           Call GetDeviceCapabilities 
           Call PrepareForOverlappedTransfer 
                 
           ReadHandle = CreateFile _ 
                 (DevicePathName, _ 
                 (GENERIC_READ Or GENERIC_WRITE), _ 
                 (FILE_SHARE_READ Or FILE_SHARE_WRITE), _ 
                 Security, _ 
                 OPEN_EXISTING, _ 
                 FILE_FLAG_OVERLAPPED, _ 
                 0)                    '此设备代号存在ReadHandle中 
            
           'For Count = 1 To 64 Step 1 
           '    OutputReportData(Count) = Count 
           'Next Count                  '"Requre UserAsddress" is in the OutputReportData() 
           'Call WriteReport 
           'Call ReadReport 
            
           'ProductInformation(UsefulMember).UserAddress = InputReportData(1) 
           'ProductInformation(UsefulMember).ProductSerialNumber = SerialNumber 
           'ProductInformation(UsefulMember).ReadCode = ReadHandle 
           'ProductInformation(UsefulMember).WriteCode = HIDHandle 
            
           UsefulMember = UsefulMember + 1 
                     
       Else 
                Result = CloseHandle _ 
                    (HIDHandle) 
       End If 
    End If 
     MemberIndex = MemberIndex + 1 
Loop Until (LastDevice = True) 
 
Result = SetupDiDestroyDeviceInfoList _ 
      (DeviceInfoSet) '释放SetupDiGetClassDevs所使用的资源 
 
Call SameDeviceDetect 
 
End Function 
 
Public Function GetDataString(Address As Long, Bytes As Long) As String 
 
Dim Offset As Integer 
Dim Result$ 
Dim ThisByte As Byte 
 
For Offset = 0 To Bytes - 1 
    Call RtlMoveMemory(ByVal VarPtr(ThisByte), ByVal Address + Offset, 1) 
    If (ThisByte And &HF0) = 0 Then 
        Result$ = Result$ & "0" 
    End If 
    Result$ = Result$ & Hex$(ThisByte) & " " 
Next Offset 
 
GetDataString = Result$ 
 
End Function 
Public Sub GetDeviceCapabilities() 
 
Dim ppData(29) As Byte 
Dim ppDataString As Variant 
 
Result = HidD_GetPreparsedData _ 
    (HIDHandle, _ 
    PreparsedData) '取得一个包含设备能力信息的缓冲区的指针 
     
Result = RtlMoveMemory _ 
    (ppData(0), _ 
    PreparsedData, _ 
    30) 
 
ppDataString = ppData() 
ppDataString = StrConv(ppDataString, vbUnicode) 
 
Result = HidP_GetCaps _ 
    (PreparsedData, _ 
    Capabilities) '传回一个包含设备能力信息的结构,主要是报表的内容 
     
Dim ValueCaps(1023) As Byte 
 
Result = HidP_GetValueCaps _ 
    (HidP_Input, _ 
    ValueCaps(0), _ 
    Capabilities.NumberInputValueCaps, _ 
    PreparsedData) '传回一个报表中关于每个数值的信息的结构数组的指针 
     
Result = HidD_FreePreparsedData _ 
    (PreparsedData) '释放HidD_GetPreparsedData所使用的资源 
 
End Sub 
 
Public Sub InitializeDisplay() 
 
Dim Count As Long 
 
frmMain.optDeviceSymbol1.Enabled = False 
frmMain.optDeviceSymbol2.Enabled = False 
frmMain.optDeviceSymbol3.Enabled = False 
frmMain.cmdOnce.Enabled = False 
frmMain.cmdOnce.Caption = "No device detected!" 
 
For Count = 1 To 64 Step 1 
    OutputReportData(Count) = 13 
Next Count 
  
 'OutputReportData(1) = 72    'H 
 'OutputReportData(2) = 97    'a 
 'OutputReportData(3) = 112   'p 
 'OutputReportData(4) = 112   'p 
 'OutputReportData(5) = 121   'y 
 'OutputReportData(6) = 32    ' 
 'OutputReportData(7) = 78    'N 
 'OutputReportData(8) = 101   'e 
 'OutputReportData(9) = 119   'w 
 'OutputReportData(10) = 32   ' 
 'OutputReportData(11) = 89   'Y 
 'OutputReportData(12) = 101  'e 
 'OutputReportData(13) = 97   'a 
 'OutputReportData(14) = 114  'r 
 'OutputReportData(15) = 33   '! 
 'OutputReportData(16) = 33   '! 
 'OutputReportData(17) = 33   '! 
' OutputReportData(18) = 129  ' 
' OutputReportData(19) = 2   ' 
' OutputReportData(20) = 33   ' 
' OutputReportData(21) = 33   ' 
' OutputReportData(22) = 33   ' 
' OutputReportData(23) = 33   ' 
' OutputReportData(24) = 33   ' 
' OutputReportData(25) = 33   ' 
' OutputReportData(26) = 33   ' 
' OutputReportData(27) = 33   ' 
' OutputReportData(28) = 33   ' 
' OutputReportData(29) = 33   ' 
' OutputReportData(30) = 33   ' 
' OutputReportData(31) = 121  ' 
' OutputReportData(32) = 122  ' 
' OutputReportData(33) = 123  ' 
' OutputReportData(34) = 124  ' 
' OutputReportData(35) = 125  ' 
' OutputReportData(36) = 128  ' 
' OutputReportData(37) = 129  ' 
  
IncreaseOfPacket = 0 
 
Call FindTheHid 
 
End Sub 
 
Public Sub PrepareForOverlappedTransfer() 
 
If EventObject = 0 Then 
    EventObject = CreateEvent _ 
        (Security, _ 
        True, _ 
        True, _ 
        "") 
End If 
 
HIDOverlapped.Offset = 0 
HIDOverlapped.OffsetHigh = 0 
HIDOverlapped.hEvent = EventObject 
 
End Sub 
Public Sub ReadAndWriteToDevice() 
Dim Count As Long 
Dim EndCount As Long 
 
EndCount = 2000 
'********************************************************1    start value 
For Count = 1 To 64 Step 1 
    OutputReportData(Count) = 13 
Next Count 
   
 OutputReportData(1) = 77    'M1 00000 
 OutputReportData(2) = 49    ' 
 OutputReportData(3) = 32    ' 
 OutputReportData(4) = 48    ' 
 OutputReportData(5) = 48    ' 
 OutputReportData(6) = 48    ' 
 OutputReportData(7) = 48    ' 
 OutputReportData(8) = 48    ' 
  
  
 Call WriteReport 
 Call ReadReport 
'****************************************************2         setp 
For Count = 1 To 64 Step 1 
    OutputReportData(Count) = 13 
Next Count 
   
 OutputReportData(1) = 77    'M4 00001 
 OutputReportData(2) = 52    ' 
 OutputReportData(3) = 32    ' 
 OutputReportData(4) = 48    ' 
 OutputReportData(5) = 48    ' 
 OutputReportData(6) = 48    ' 
 OutputReportData(7) = 48    ' 
 OutputReportData(8) = 49    ' 
  
 Call WriteReport 
 Call ReadReport 
'****************************************************3           stop 
For Count = 1 To 64 Step 1 
    OutputReportData(Count) = 13 
Next Count 
   
 OutputReportData(1) = 77   'M5 02000 
 OutputReportData(2) = 53   ' 
 OutputReportData(3) = 32   ' 
 OutputReportData(4) = 48   ' 
 OutputReportData(5) = 50   ' 
 OutputReportData(6) = 48   ' 
 OutputReportData(7) = 48   ' 
 OutputReportData(8) = 48   ' 
  
 Call WriteReport 
 Call ReadReport 
'****************************************************4           if limit 
For Count = 1 To 64 Step 1 
    OutputReportData(Count) = 13 
Next Count 
   
 OutputReportData(1) = 77   'MF 03000 
 OutputReportData(2) = 70   ' 
 OutputReportData(3) = 32   ' 
 OutputReportData(4) = 48   ' 
 OutputReportData(5) = 51   ' 
 OutputReportData(6) = 48   ' 
 OutputReportData(7) = 48   ' 
 OutputReportData(8) = 48   ' 
  
 Call WriteReport 
 Call ReadReport 
'****************************************************5           IPO limit 
For Count = 1 To 64 Step 1 
    OutputReportData(Count) = 13 
Next Count 
   
 OutputReportData(1) = 77   'MP 03000 
 OutputReportData(2) = 80   ' 
 OutputReportData(3) = 32   ' 
 OutputReportData(4) = 48   ' 
 OutputReportData(5) = 51   ' 
 OutputReportData(6) = 48   ' 
 OutputReportData(7) = 48   ' 
 OutputReportData(8) = 48   ' 
  
 Call WriteReport 
 Call ReadReport 
'****************************************************6           MA 
For Count = 1 To 64 Step 1 
    OutputReportData(Count) = 13 
Next Count 
   
 OutputReportData(1) = 77    'MA 
 OutputReportData(2) = 65    ' 
  
 Call WriteReport 
 Call ReadReport 
'****************************************************7              N 
For Count = 1 To 64 Step 1 
    OutputReportData(Count) = 13 
Next Count 
   
 OutputReportData(1) = 78    'N 
  
For Count = 1 To EndCount 
 
   If Count = 2 Then 
      Count = Count    ''''''''''''''''''''''''''''''''''''''' 
   End If 
 
   If MyDeviceDetected = True Then 
      Call WriteReport 
      If MyDeviceDetected = True Then 
         Call ReadReport 
      End If 
   End If 
 
   If MyDeviceDetected = False Then 
      Count = EndCount '''''''''''''''''''''如有出错,则退出此次操作 
      MyDeviceDetected = FindTheHid 
   End If 
 
Next Count 
 
'frmMain.lstResults.AddItem "MessageOk" 
'frmMain.txtBytesReceived.SelText = IncreaseOfPacket 
 
frmMain.lstResults.ListIndex = frmMain.lstResults.ListCount - 1 '垂直滚动条滑块置底 'frmMain!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
 
End Sub 
 
Public Sub ReadReport() 
 
Dim Count 
Dim NumberOfBytesRead As Long 
'Dim ReadBuffer() As Byte 
'Dim UBoundReadBuffer As Integer 
Dim ByteValue As String 
Dim MessageOk As String 
 
  
ReDim InputReportData(Capabilities.InputReportByteLength - 1) 
frmMain.lstResults.ListIndex = frmMain.lstResults.ListCount - 1 '出错拉 'frmMain!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
 
Result = ReadFile _ 
    (ReadHandle, _ 
    InputReportData(0), _ 
    CLng(Capabilities.InputReportByteLength), _ 
    NumberOfBytesRead, _ 
    HIDOverlapped) '重叠读取输入报表 
 
frmMain.lstResults.ListIndex = frmMain.lstResults.ListCount - 1  'frmMain!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
'bAlertable = True 
 
Result = WaitForSingleObject _ 
    (EventObject, _ 
    20000) '延时读取,传回码用来指示发生何种情况 
 
Select Case Result 
    Case WAIT_OBJECT_0 
    Case WAIT_TIMEOUT 
         Result = CancelIo _ 
             (ReadHandle) 
         CloseHandle (HIDHandle) 
         CloseHandle (ReadHandle) 
         frmMain.lstResults.AddItem "  Data is not prepared!" 
         'frmMain!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
         'End If 
         MyDeviceDetected = False 
    Case Else 
         frmMain.lstResults.AddItem "  Undefined error!" 
           'frmMain!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
        'End If 
        MyDeviceDetected = False 
End Select 
 
'IncreaseOfPacket = IncreaseOfPacket + 1 
 
If MyDeviceDetected = True Then 
    frmMain.txtBytesReceived.SelText = IncreaseOfPacket + 1 & vbCrLf 'frmMain!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
    IncreaseOfPacket = IncreaseOfPacket + 1 
    For Count = 1 To UBound(InputReportData) 
        If Len(Hex$(InputReportData(Count))) < 2 Then 
            ByteValue = "0" & Hex$(InputReportData(Count)) 
        Else 
            ByteValue = Hex$(InputReportData(Count)) 
        End If 
 
        MessageOk = MessageOk & Chr(InputReportData(Count)) 
 
        If InputReportData(Count + 1) = 13 Then 
           Count = UBound(InputReportData) 
        End If 
    Next Count 
    frmMain.lstResults.AddItem MessageOk 
 
End If 
 
End Sub 
 
Public Sub WriteReport() 
 
Dim Count As Integer 
'Dim NumberOfBytesRead As Long 
'Dim NumberOfBytesToSend As Long 
Dim NumberOfBytesWritten As Long 
'Dim ReadBuffer() As Byte 
Dim SendBuffer() As Byte 
 
ReDim SendBuffer(Capabilities.OutputReportByteLength - 1) 
 
SendBuffer(0) = 0 
For Count = 1 To Capabilities.OutputReportByteLength - 1 
    SendBuffer(Count) = OutputReportData(Count) 
Next Count 
 
NumberOfBytesWritten = 0 
 
Result = WriteFile _ 
    (HIDHandle, _ 
    SendBuffer(0), _ 
    CLng(Capabilities.OutputReportByteLength), _ 
    NumberOfBytesWritten, _ 
    0) 
      
If Result = False Then 
   MyDeviceDetected = False 
End If 
 
End Sub 
 
Public Sub SameDeviceDetect() 
Dim Count As Byte 
Dim CountSub As Byte 
Dim Message As String 
 
'Message = "At least 2 Device use the same address!Please change your setting!" 
'MsgBox Message, vbExclamation + vbOKOnly, "Error" 
'Message = "There are at least 1 counterfeit product!" 
'MsgBox Message, vbCritical + vbOKOnly, "Error" 
 
'If MyDeviceDetected = True Then 
' 
'   For Count = 0 To UsefulMember - 1 
'       For CountSub = Count + 1 To UsefulMember - 1 
'           If ProductInformation(Count).UserAddress = ProductInformation(CountSub).UserAddress Then 
'              Message = "At least 2 Device use the same address!Please change your setting!" 
'              MsgBox Message, vbExclamation + vbOKOnly, "Error" 
'              Count = UsefulMember - 1 
'              CountSub = UsefulMember - 1 
'              MyDeviceDetected = False 
'           End If 
'       Next CountSub 
'   Next Count                           'At least 2 Device use the same address? 
' 
'   For Count = 0 To UsefulMember - 1 
'       For CountSub = Count + 1 To UsefulMember - 1 
'           If ProductInformation(Count).ProductSerialNumber = ProductInformation(CountSub).ProductSerialNumber Then 
'              Message = "There are at least 1 counterfeit product!" 
'              MsgBox Message, vbCritical + vbOKOnly, "Error" 
'              Count = UsefulMember - 1 
'              CountSub = UsefulMember - 1 
'              MyDeviceDetected = False 
'           End If 
'       Next CountSub 
'   Next Count                            'There are at least 1 counterfeit product? 
    
'   If MyDeviceDetected = True Then 
'      If UsefulMember > 2 Then 
'         frmMain.optDeviceSymbol1.Enabled = True 
'         frmMain.optDeviceSymbol2.Enabled = True 
'         frmMain.optDeviceSymbol3.Enabled = True 
'         frmMain.optDeviceSymbol1.Value = True 
'         HIDHandle = ProductInformation(0).WriteCode 
'         ReadHandle = ProductInformation(0).ReadCode 
'         frmMain.optDeviceSymbol1.Caption = "Device " & ProductInformation(0).UserAddress 
'         frmMain.optDeviceSymbol2.Caption = "Device " & ProductInformation(1).UserAddress 
'         frmMain.optDeviceSymbol3.Caption = "Device " & ProductInformation(2).UserAddress 
'      End If 
'      If UsefulMember > 1 Then 
'         frmMain.optDeviceSymbol1.Enabled = True 
'         frmMain.optDeviceSymbol2.Enabled = True 
'         frmMain.optDeviceSymbol1.Value = True 
'         HIDHandle = ProductInformation(0).WriteCode 
'         ReadHandle = ProductInformation(0).ReadCode 
'         frmMain.optDeviceSymbol1.Caption = "Device " & ProductInformation(0).UserAddress 
'         frmMain.optDeviceSymbol2.Caption = "Device " & ProductInformation(1).UserAddress 
'      End If 
'      If UsefulMember > 0 Then 
'         frmMain.optDeviceSymbol1.Enabled = True 
'         frmMain.optDeviceSymbol1.Value = True 
'         HIDHandle = ProductInformation(0).WriteCode 
'         ReadHandle = ProductInformation(0).ReadCode 
'         frmMain.optDeviceSymbol1.Caption = "Device " & ProductInformation(0).UserAddress 
'      End If 
' 
'      frmMain.cmdOnce.Enabled = True 
'      frmMain.cmdOnce.Caption = "Transmit" 
'   End If 
'End If 
 
 
 
If MyDeviceDetected = True Then 
         frmMain.optDeviceSymbol1.Enabled = True 
'         frmMain.optDeviceSymbol2.Enabled = True 
         frmMain.optDeviceSymbol1.Value = True 
'         HIDHandle = ProductInformation(0).WriteCode 
'         ReadHandle = ProductInformation(0).ReadCode 
'         frmMain.optDeviceSymbol1.Caption = "Device " & ProductInformation(0).UserAddress 
'         frmMain.optDeviceSymbol2.Caption = "Device " & ProductInformation(1).UserAddress 
 
         frmMain.cmdOnce.Enabled = True 
         frmMain.cmdOnce.Caption = "Transmit" 
End If 
 
 
If MyDeviceDetected = False Then 
      frmMain.optDeviceSymbol1.Enabled = False 
      frmMain.optDeviceSymbol2.Enabled = False 
      frmMain.optDeviceSymbol3.Enabled = False 
      frmMain.optDeviceSymbol1.Caption = "No Device" 
      frmMain.optDeviceSymbol2.Caption = "No Device" 
      frmMain.optDeviceSymbol3.Caption = "No Device" 
      frmMain.cmdOnce.Enabled = False 
      frmMain.cmdOnce.Caption = "No device detected!" 
End If 
 
 
 
End Sub