我正在尝试使用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
答案 0 :(得分:4)
这是我的代码,它适用于运行TI数据管道USB堆栈的MSP430F芯片。这基本上是隐藏的输入和输出端点,它们充当自定义数据管道,允许我以任何我想要的格式发送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_report = device.find_output_reports()”而不使用“[0]”。 然后使用
out_report[0].set_raw_data(buffer)
最后
out_report[0].send()
希望这可以帮助你。
答案 1 :(得分:0)
HID非常强大,但没有人使用正确的HID枚举,HID提供了一个非常灵活(不容易)的架构来描述其报告的格式。
对于一个简单的设备,我建议使用简单的字节数组来开始使用,这将使主机应用程序为您的数据项提供上下文。
无论如何,原始报道在这里我们再来一次......
对任何给定的输出报告使用starting_data = output_report.get_raw_data()[:],然后直接更改任何'raw'元素。
当然,理想情况下,您已经正确定义了用法,并且您可以独立更改报表项,而无需猜测位宽和位置: - )