关于python使用HID接口的心得

一、背景

我当前使用的设备能同时具备两个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()
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值