首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

USB-HID装置不能写入

2013-09-29 
USB-HID设备不能写入最近开发了USB-HID设备通信程序,发现能读取数据,但是不能写入数据,不知道什么原因。。。

USB-HID设备不能写入
最近开发了USB-HID设备通信程序,
发现能读取数据,但是不能写入数据,不知道什么原因。。。
打开设备如下:
        HIDHandle = CreateFile _
            (DevicePathName, _
            GENERIC_READ Or GENERIC_WRITE, _
            (FILE_SHARE_READ Or FILE_SHARE_WRITE), _
            Security, _
            OPEN_EXISTING, _
            0&, _
            0)

打开后设备的OutputReportByteLength=0,所以无法写数据,有懂的吗?
[解决办法]
DevicePathName必须是"\\."开头的,不知道你的是不是?

[解决办法]
Option Explicit

'例子
'Example by Howard Henry Schlunder
' This example requires one command button (Command1)
Private Declare Function GetVersion Lib "kernel32" () As Long
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function DeviceIoControl Lib "kernel32" (ByVal hDevice As Long, ByVal dwIoControlCode As Long, lpInBuffer As Any, ByVal nInBufferSize As Long, lpOutBuffer As Any, ByVal nOutBufferSize As Long, lpBytesReturned As Long, lpOverlapped As Any) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Const INVALID_HANDLE_VALUE = -1
Private Const OPEN_EXISTING = 3
Private Const FILE_FLAG_Delete_ON_CLOSE = 67108864
Private Const GENERIC_READ = &H80000000
Private Const GENERIC_WRITE = &H40000000
Private Const IOCTL_STORAGE_EJECT_MEDIA = 2967560
Private Const VWIN32_DIOC_DOS_IOCTL = 1

Private Type DIOC_REGISTERS
    reg_EBX As Long
    reg_EDX As Long
    reg_ECX As Long
    reg_EAX As Long
    reg_EDI As Long
    reg_ESI As Long
    reg_Flags As Long
End Type

Private Sub Command1_Click()
    Dim bolP As Boolean
    bolP = funEjectUSBDevice("h")
    Debug.Print bolP
End Sub
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'函数功能:弹出USB设备或光盘
'参数说明:strDeviceName:设备名称(盘符),例如:E
'返回说明:成功 True    失败    False
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Private Function funEjectUSBDevice(ByVal strDeviceName As String) As Boolean
    Dim hDrive As Long
    Dim DummyReturnedBytes As Long
    Dim EjectDrive As String
    Dim DriveLetterAndColon As String
    Dim RawStuff As DIOC_REGISTERS
On Error GoTo errFun
    funEjectUSBDevice = False
    If strDeviceName = "" Then Exit Function
    EjectDrive = strDeviceName
    If Len(EjectDrive) Then 'Confirm the user didn't cancel
        DriveLetterAndColon = UCase(Left$(EjectDrive & ":", 2)) 'Make it all caps for easy interpretation
        If GetVersion >= 0 Then     'We are running Windows NT/2000
            hDrive = CreateFile("\\." & DriveLetterAndColon, GENERIC_READ Or GENERIC_WRITE, 0, ByVal 0, OPEN_EXISTING, 0, 0)
            If hDrive <> INVALID_HANDLE_VALUE Then


                'Eject media!
                Call DeviceIoControl(hDrive, IOCTL_STORAGE_EJECT_MEDIA, 0, 0, 0, 0, DummyReturnedBytes, ByVal 0)
                Call CloseHandle(hDrive) 'Clean up after ourselves
            End If
        Else    'We are running Win9x/Me
            hDrive = CreateFile("\\.\VWIN32", 0, 0, ByVal 0, 0, FILE_FLAG_Delete_ON_CLOSE, 0)
            If hDrive <> INVALID_HANDLE_VALUE Then
                'Setup our raw registers to use Interrupt 21h Function 440Dh Minor Code 49h
                RawStuff.reg_EAX = &H440D 'The function to use
                RawStuff.reg_EBX = Asc(DriveLetterAndColon) - Asc("A") + 1 'The drive to do it on
                RawStuff.reg_ECX = &H49 Or &H800 'The minor code of the function in the low byte of the low word and the device category of 8 in the high byte of the low word
                'Eject media!
                Call DeviceIoControl(hDrive, VWIN32_DIOC_DOS_IOCTL, RawStuff, LenB(RawStuff), RawStuff, LenB(RawStuff), DummyReturnedBytes, ByVal 0)
                Call CloseHandle(hDrive) 'Clean up after ourselves
            End If
        End If
    End If
    funEjectUSBDevice = True
    Exit Function
errFun:
    funEjectUSBDevice = False
End Function

Private Sub Form_Load()

End Sub

[解决办法]
不是:\\?\
是:\\.\
应该是驱动层的约定吧
[解决办法]
看看有无 FeatureReportByteLength?用 SetFeature 方法写。

[解决办法]
对了,设备有哪些报表,是否允许主机写,是设备固件代码决定的。有些 HID 设备,作为纯粹的输入接口,是不需要主机写操作的。

热点排行