一、背景
我当前使用的设备能同时具备两个interface:HID-keyboard和HID-POS
现在我需要通过HID-POS进行上位机与设备的交互
HID-POS是支持双向通讯的,即既能从上位机向设备发送讯息,设备也能向上位机发送讯息
二、python库的使用
1,pyusb
安装:
pip install pyusb
导入:
import usb.core
import usb.util
这个库在我这边行不通,它只能识别出HID-keyboard,但我要使用的是HID-POS
如果有谁知道这个库识别出HID-POS方法,可以在评论区交流一下
2,hidapi
安装:
pip install hidapi
导入:
import hid
具体使用教程参考:
hidapi官方文档
三、注意点
如果设备同时拥有两个以上的interface时(比如同时拥有HID-keyboard和HID-POS),不能使用PID,VID的方法打开端口,转而使用路径打开
例如:
#同一设备有多个interface的不能用PID,VID打开端口
h.open_path(b'\\\\?\\HID#VID_xxxx&PID_xxxx&MI_01#7&c640d0d&0&0000#{xxxxx-xxx-xxx-88cb-001111000030}')
#下面的方法只会通过HID-keyboard传输
#h.open(0x98ff,0x87ff)
四、自用demo
import hid
import time
import threading
devices = hid.enumerate(0, 0)
#打印所有的devices路径,找到需要的去打开端口
for i in devices:
print(i)
h = hid.device()
#同一设备有多个interface的不能用PID,VID打开端口
h.open_path(b'\\\\?\\HID#VID_xxxx&PID_xxxxx&MI_01#7&c640d0d&0&0000#{000030}')
#h.open(0xffff,0xffE0)
h.set_nonblocking(1)
manu = h.get_manufacturer_string()
prod = h.get_product_string()
print("制造商:%s,端口属性:%s"%(manu,prod))
def send_raw_HIDcmd():
raw_cmd = input("输入指令")
raw_cmd_bytes = raw_cmd.encode().decode("unicode_escape").encode("cp1252")
cmd_len = len(raw_cmd_bytes)
cmd_bytes_2_int = []
for i in raw_cmd_bytes:
cmd_bytes_2_int += [i]
#分为大小为60的一包(每包最大为64)
packet_cnt = len(cmd_bytes_2_int)//60 + 1
i = 0
while i <packet_cnt:
if i+1 == packet_cnt:#结束包
split_packet = cmd_bytes_2_int[i*60:]
else:
split_packet = cmd_bytes_2_int[i*60:(i+1)*60]
cmd_len = len(split_packet)
cmd_list = [0xfd] + [cmd_len] + split_packet#0xfd是指定消息头,cmd_len是传输数据长度
h.write(cmd_list)
i += 1
def read_HIDcmd():
data = []
while True:
d = h.read(64)
if d:
data += d
print(d)
if __name__ == "__main__":
send_raw_HIDcmd()
t = threading.Thread(target=read_HIDcmd)#h.read()没有阻塞的功能,但是可以设置超时,我选择线程不停接收数据
t.start()