首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python中对USB HID设备进行简单的读写?

在Python中对USB HID设备进行简单的读写?
EN

Stack Overflow用户
提问于 2012-10-09 22:34:23
回答 2查看 24.4K关注 0票数 2

我有一个相当简单的USB HID设备,我一直在尝试弄清楚如何使用Python对其进行读写。我已经能够使用PyWinUSB读取它,但当我尝试写入它时出现了问题。尝试写到它会让东西爆炸。

例如:

代码语言:javascript
复制
device = hid.HidDeviceFilter(vendor_id = 0x0003, product_id = 0x1001).get_devices()[0]

这可以很好地工作。然后是读取原始数据,这是我现在关心的所有事情(一旦我能弄清楚如何写入被诅咒的东西,我就会用到它):

代码语言:javascript
复制
def readData(data):
    print(data)
    return None

它工作得很好(事实上,当我看到它工作时,它是相当令人兴奋的)。因此,我将像这样分配数据处理程序:

代码语言:javascript
复制
device.set_raw_data_handler(readData)

每次我按下按钮,都没问题。正如您所期望的那样,数据通过了。这太棒了!

当我想要写入设备时,问题就出现了。按照示例simple_send文件作为模板(这可能不是最佳选择),我将执行以下操作:

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

这将返回一个具有包含4个条目的字典的报告对象。对吗?是否使用output_reports对象写入设备?尝试通过将报告值设置为任何值来执行此操作:

代码语言:javascript
复制
report[<key>] = "pneumonoultramicroscopicvolcanoconiosis"
report.send()

这会一直返回一些我无法解释的讨厌的错误:

代码语言:javascript
复制
    Traceback (most recent call last):
  File "<pyshell#21>", line 1, in <module>
    report.send()
  File "C:\Python27\lib\site-packages\pywinusb-0.3.1-py2.7.egg\pywinusb\hid\core.py", line 1446, in send
    self.__prepare_raw_data()
  File "C:\Python27\lib\site-packages\pywinusb-0.3.1-py2.7.egg\pywinusb\hid\core.py", line 1401, in __prepare_raw_data
    byref(self.__raw_data), self.__raw_report_size) )
  File "C:\Python27\lib\site-packages\pywinusb-0.3.1-py2.7.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

我使用的是Windows7,我(终于)找到了HID DLL导出函数的引用,而且我不需要(或者,就这一点而言,甚至真的不想)使用PyWinUSB库。我只是想让它工作,这看起来并不是那么困难,但它确实如此。

谁能告诉我我到底做错了什么?

谢谢。

此外,我尝试跟踪错误调用,并在程序刚刚关闭之前一直跟踪到现在,这有点令人沮丧。

EN

回答 2

Stack Overflow用户

发布于 2013-01-22 02:29:14

我用这个让它工作了

代码语言:javascript
复制
    buffer= [0xFF]*33 # 33 = report size + 1 byte (report id)
    buffer[0]=0x0 # report id
    buffer[1]=0xFE
    buffer[2]=0x00
    buffer[3]=0xFF
    out_report.set_raw_data(buffer)
    out_report.send()
    dev.close()
票数 3
EN

Stack Overflow用户

发布于 2013-11-28 22:45:42

对我来说,唯一有效的方法是:

代码语言:javascript
复制
 report.send([0x70, ..., 0x73 ])

使用set_raw_data([0x70, ..., 0x73)和后续send()的函数调用序列对我不起作用。

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

https://stackoverflow.com/questions/12802401

复制
相关文章

相似问题

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