如何使用python/pywinusb将hid数据发送到设备?

如何使用python/pywinusb将hid数据发送到设备?,python,usb,hid,pywinusb,Python,Usb,Hid,Pywinusb,我正在尝试使用pywinusb将输出报告发送到pic18f4550。该设备可以接收数据,我用C#应用程序对其进行了测试,效果良好。另外,我可以用pywinusb从设备读取数据,但在发送数据时遇到了问题 以下是我正在运行的代码: from pywinusb import hid filter = hid.HidDeviceFilter(vendor_id = 0x0777, product_id = 0x0077) devices = filter.get_devices() if devic

我正在尝试使用pywinusb将输出报告发送到pic18f4550。该设备可以接收数据,我用C#应用程序对其进行了测试,效果良好。另外,我可以用pywinusb从设备读取数据,但在发送数据时遇到了问题

以下是我正在运行的代码:

from pywinusb import hid

filter = hid.HidDeviceFilter(vendor_id = 0x0777, product_id = 0x0077)
devices = filter.get_devices()

if devices:
    device = devices[0]
    print "success"

device.open()
out_report = device.find_output_reports()[0]

buffer= [0x00]*65
buffer[0]=0x0
buffer[1]=0x01
buffer[2]=0x00
buffer[3]=0x01

out_report.set_raw_data(buffer)
out_report.send()
dev.close()
它会产生以下错误:

success
Traceback (most recent call last):
  File "C:\Users\7User\Desktop\USB PIC18\out.py", line 24, in <module>
    out_report.send()
  File "build\bdist.win32\egg\pywinusb\hid\core.py", line 1451, in send
    self.__prepare_raw_data()
  File "build\bdist.win32\egg\pywinusb\hid\core.py", line 1406, in __prepare_raw_data
    byref(self.__raw_data), self.__raw_report_size) )
  File "build\bdist.win32\egg\pywinusb\hid\winapi.py", line 382, in __init__
    raise helpers.HIDError("hidP error: %s" % self.error_message_dict[error_code])
HIDError: hidP error: data index not found
成功
回溯(最近一次呼叫最后一次):
文件“C:\Users\7User\Desktop\USB PIC18\out.py”,第24行,in
out_report.send()
文件“build\bdist.win32\egg\pywinusb\hid\core.py”,第1451行,在send中
自行准备原始数据()
文件“build\bdist.win32\egg\pywinusb\hid\core.py”,第1406行,在原始数据中
byref(自组织原始数据)、自组织原始报告大小)
文件“build\bdist.win32\egg\pywinusb\hid\winapi.py”,第382行,在\uuu init中__
raise helpers.HIDEROR(“hidP错误:%s”%self.error\u message\u dict[错误代码])
hidP错误:找不到数据索引

这是我的代码,它与运行TI datapipe USB堆栈的MSP430F芯片一起工作。这基本上是作为自定义数据管道的hid输入和输出端点,允许我以我想要的任何格式发送64个字节,但第一个字节是ID号(由TI定义)十进制63,第二个字节是数据包中相关或有用的字节数(64字节最大数据包)使用上面描述的前两个字节。我花了一段时间才弄明白这一点,主要是因为缺少文档。pywinusb附带的几个例子充其量也很难学习。无论如何,这是我的密码。它与我的micro一起工作,所以这应该对您有所帮助

        filter = hid.HidDeviceFilter(vendor_id = 0x2048, product_id = 0x0302)
    hid_device = filter.get_devices()
    device = hid_device[0]
    device.open()
    print(hid_device)


    target_usage = hid.get_full_usage_id(0x00, 0x3f)
    device.set_raw_data_handler(sample_handler)
    print(target_usage)


    report = device.find_output_reports()

    print(report)
    print(report[0])

    buffer = [0xFF]*64
    buffer[0] = 63

    print(buffer)

    report[0].set_raw_data(buffer)
    report[0].send()
有一个地方可能会把你搞砸,那就是:

out_report = device.find_output_reports()[0]
尝试使用“out\u report=device.find\u output\u reports()”,结尾不带“[0]”。 然后使用

out_report[0].set_raw_data(buffer)
最后

out_report[0].send()

希望这对您有所帮助。

HID功能非常强大,但没有人使用正确的HID枚举,HID提供了一个非常灵活(但不容易)的模式来描述其报告的格式

对于一个简单的设备,我建议使用一个简单的字节数组用法开始,这将为主机应用程序提供数据项的上下文

不管怎样,原始报告又来了

使用starting_data=output_report。为任何给定的输出报告获取_raw_data()[:],然后直接更改任何“raw”元素


当然,理想情况下,您应该有正确定义的用法,并且能够独立地更改报告项,而不必猜测位宽度和位置:-)

如果
设备。查找输出报告()
从未找到任何输出报告,我如何发送输出报告?它总是为我返回
[]
。。。第一个字节等于报告id,在我的例子中为0…知道如何读取输入报告吗?我想要一个阻塞命令;因此,如果没有set_raw_data_handler方法