如何解决使用 PyUSB 读写 HID 设备不是 HIDAPI
我想在pysub中实现python hidapi的读写调用。
使用 python hidapi 的示例代码,如下所示:
import hid
hdev = hid.device()
h = hdev.open_path( path )
h.write( send_buffer )
res = h.read( 64 )
receive_buffer = bytearray( res )
我遇到的主要问题是 python hidapi read() 返回一个整数列表(从硬件接收的缓冲区中的每个字节一个 python int),我需要缓冲区作为字节并忠实于收到了什么。(*)
第二个问题是打开、读取和写入是我唯一需要的东西,我需要使系统尽可能轻巧。因此我想避免额外的依赖。
(*) bytearray() 在这种情况下不是一个好的解决方案,原因超出了这个问题的范围。
解决方法
这是一个似乎有效的最小代码示例。 HID 设备是一个 Teensy 板,它使用其 RAWHID.recv() 和 RAWHID.send() 与主机交换文本和二进制文件。
#!/usr/bin/python
import usb.core
import usb.util
dev = usb.core.find(idVendor=0x16C0,idProduct=0x0486)
try:
dev.reset()
except Exception as e:
print( 'reset',e)
if dev.is_kernel_driver_active(0):
print( 'detaching kernel driver')
dev.detach_kernel_driver(0)
endpoint_in = dev[0][(0,0)][0]
endpoint_out = dev[0][(0,0)][1]
# Send a command to the Teensy
endpoint_out.write( "version".encode() + bytes([0]) )
# Read the response,an array of byte,.tobytes() gives us a bytearray.
buffer = dev.read(endpoint_in.bEndpointAddress,64,1000).tobytes()
# Decode and print the zero terminated string response
n = buffer.index(0)
print( buffer[:n].decode() )
,
我已经做了一些快速的基准测试,看起来 DrM's answer 在处理 array
方面肯定朝着正确的方向前进,但有一个稍微更好的转换选择。下面是在 64 字节数据缓冲区上运行 1000 万次迭代的结果。
使用
data_list = [30] * 64
data_array = array('B',data_list)
我以秒为单位获得以下运行时间:
技术 | 时间(秒,1000 万次迭代) |
---|---|
bytearray(data_list) |
12.7 |
bytearray(data_array) |
3.0 |
data_array.tobytes() |
2.0 |
struct.pack('%uB' % len(data_list),*data_list) |
18.6 |
struct.pack('%uB' % len(data_array),*data_array) |
22.5 |
似乎使用array.tobytes
方法最快,其次是调用bytearray
,并以array
为参数。
显然我在每次迭代中都重用了相同的缓冲区,可能还有其他不切实际的因素,所以 YMMV。这些应该是相对于彼此的指示性结果,即使不是绝对的。此外,这显然没有考虑到 bytearray
与 bytes
的性能。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。