微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 PyUSB 读写 HID 设备不是 HIDAPI

如何解决使用 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。这些应该是相对于彼此的指示性结果,即使不是绝对的。此外,这显然没有考虑到 bytearraybytes 的性能。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。