首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用python / pywinusb向设备发送hid数据?

如何使用python / pywinusb向设备发送hid数据?
EN

Stack Overflow用户
提问于 2013-05-03 19:20:47
回答 2查看 17.6K关注 0票数 2

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

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

代码语言:javascript
复制
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()

它会产生以下错误:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-26 12:25:17

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

代码语言:javascript
复制
        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()

有一个地方可能会让你搞砸,那就是:

代码语言:javascript
复制
out_report = device.find_output_reports()[0]

尝试使用末尾不带"“的"out_report = device.find_output_reports()”。然后使用

代码语言:javascript
复制
out_report[0].set_raw_data(buffer)

最后

代码语言:javascript
复制
out_report[0].send()

希望这能帮到你。

票数 5
EN

Stack Overflow用户

发布于 2015-03-25 07:17:15

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

对于简单的设备,我推荐使用简单的字节数组开始,这将给主机应用程序提供数据项的上下文。

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

对任何给定的输出报告使用starting_data = output_report.get_raw_data(),然后直接更改任何“原始”元素。

当然,理想情况下,您应该正确定义了用法,并且能够独立地更改报表项,而无需猜测位宽和位置:-)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16357756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档