PyUSB的初识

PyUSB modules

内容描述
coreUSB主要模块
util实用功能模块
control标准控制请求模块
legacy0.x兼容性层
backend包含内置后端的子包

开始

pip install pyusb
查看USB的VID和PID
设备管理器->找到USB设备右键->属性->详细信息->硬件id

到目前为止设备的硬件id没有变动过。
在这里插入图片描述

测试程序:
import usb.core
import usb.util

dev = usb.core.find(idVendor=0x067B, idProduct=0x2303)
if dev is None:
    raise ValueError('Device not found')

print(dev)

可以查看USB信息的字段和对应的值。
在这里插入图片描述

官方测试代码

需要用zadig安装libusb-win32驱动

import usb.core
import usb.util

# find our device
dev = usb.core.find(idVendor=0x067B, idProduct=0x2303)

# was it found?
if dev is None:
    raise ValueError('Device not found')

# set the active configuration. With no arguments, the first
# configuration will be the active one
dev.set_configuration()

# get an endpoint instance
cfg = dev.get_active_configuration()
intf = cfg[(0,0)]

ep = usb.util.find_descriptor(
    intf,
    # match the first OUT endpoint
    custom_match = \
    lambda e: \
        usb.util.endpoint_direction(e.bEndpointAddress) == \
        usb.util.ENDPOINT_OUT)

assert ep is not None

# write the data
ep.write('test')

cfg是dev的设备信息。
intf是cfg中的子信息,包含接口和端点信息。
epENDPOINT_OUT的端点信息。
assert判断为true正常执行,false抛出异常。
ep.write('test')还可以用python dev.write(0x2,'text')代替,0x2是out的bEndpointAddress的值,返回的是字符的个数

遍历所有设备
代码后面加上

import sys

for cfg in dev:
    sys.stdout.write(str(cfg.bConfigurationValue) + '\n')

查询接口和端点信息

import usb.core
import usb.util
import sys
dev = usb.core.find(idVendor=0x067B, idProduct=0x2303)
for cfg in dev:
	sys.stdout.write(str(cfg.bConfigurationValue) + '\n')
	for intf in cfg:
		sys.stdout.write('\t' + str(intf.bInterfaceNumber) + \
				 ',' + str(intf.bAlternateSetting) + '\n')
		for ep in intf:
			sys.stdout.write('\t\t' + str(ep.bEndpointAddress) + \
					 '\n')

在这里插入图片描述
从运行结果可以看出遍历设备可以访问接口,遍历接口可以访问端点,有三个端点对应的ENDPOINT分别为129,2,131
也可以用下面的代码获得对应的描述符

# access the first configuration
cfg = dev[0]
# access the first interface
intf = cfg[(0,0)]
# third endpoint
ep = intf[2]

获得设备后的第一件事情是set_configuration(bConfigurationValue)设置bConfigurationValue,bConfigurationValue为空时表示默认设置。

四种传输方式

(1)同步传输方式(synchronous)
该方式占用预先制定好的带宽,并且有预定发送延时,用来连接需要连续传输数据,且对数据的正确性要求不高而对时间极为敏感的外部设备。在传送数据发生错误时,usb并不处理这些错误,而是续传新的数据。同步传输每次传输的最大有效负荷可为1024字节。
(2)中断传输方式(interrupt)
该方式用来传输由设备自发产生的数据,传输数据量很小,但这些数据需要及时处理,以达到实时效果。此方式主要用在键盘、鼠标及操纵杆等设备上。全速设备每次中断传输的最大有效负荷可为64个字节,而低速设备每次中断传输的最大有效负荷仅为8个字节。
(3)控制传输方式(control)
该方式用来处理主端口到usb从端口的数据传输,包括设备控制指令、设备各状态查询及确认命令。当usb设备收到这些数据和命令后,将依据先进先出的原则(队列)处理到达的数据。其传输的最大负荷与中断传输方式相同。是唯一一个结构化数据的传输
(4)批量传输方式(bulk)
该方式用来传输要求正确无误的数据。通常打印机、扫描仪和数字相机以这种方式与主机连接。在数据相对比较多和突发数据量较大时使用,在传输限制方面具有很宽的动态自由度。批量传输每次数据传输的最大有效负荷可为64个字节。

非控制传输方式

msg = 'test'
assert dev.write(0x2, msg, 100) == len(msg)

第一个参数是OUT的端点,第二个参数是发送的字节数,第三个参数是超时(可选项)。

ret = dev.read(0x81, len(msg), 100)
sret = ''.join([chr(x) for x in ret])

第一个参数是IN的端点,第二个参数是接收的字节数,chr() 用一个范围在 range(256)内的(就是0~255)整数作参数,返回一个对应的字符。

控制传输方式

msg = 'test'
assert dev.ctrl_transfer(0x40, CTRL_LOOPBACK_WRITE, 0, 0, msg) == len(msg)
ret = dev.ctrl_transfer(0xC0, CTRL_LOOPBACK_READ, 0, 0, len(msg))
sret = ''.join([chr(x) for x in ret])

第一个参数bmRequestType,第二个参数bmRequest可以是CTRL_LOOPBACK_WRITE写消息或者CTRL_LOOPBACK_READ读消息,第三个参数wValue,第四个参数wIndex,第五个参数可以是OUT输出的数据字节数,或者IN输入的数据字节数。

测试代码

import sys
import usb.core
import usb.util

dev = usb.core.find(idVendor=0x1C4F, idProduct=0x0034)
dev.set_configuration()
ret = dev.read(0x81, 0x7, 10000)
print(ret)
嗨!对于使用Python编程来控制USB设备,你可以使用`pyusb`库。`pyusb`允许你与USB设备进行通信,发送和接收数据。 如果你还没有安装`pyusb`库,你可以使用以下命令在Python环境中安装它: ``` pip install pyusb ``` 一旦你安装好了`pyusb`库,你可以开始使用它来控制USB设备。你需要先找到你要控制的USB设备的设备号,然后打开连接并与设备进行通信。 下面是一个简单的例子,演示如何使用`pyusb`发送和接收数据: ```python import usb.core # 在这里设置你的USB设备的vendor id和product id vendor_id = 0xXXXX product_id = 0xXXXX # 查找设备 dev = usb.core.find(idVendor=vendor_id, idProduct=product_id) # 打开设备连接 dev.open() # 发送数据 data = [0x01, 0x02, 0x03] dev.write(1, data) # 接收数据 recv_data = dev.read(0x81, 64) # 关闭设备连接 dev.close() ``` 在上面的代码中,你需要替换`vendor_id`和`product_id`为你要控制的USB设备的对应值。然后,使用`usb.core.find()`方法查找设备并打开连接。然后,你可以使用`dev.write()`方法发送数据,使用`dev.read()`方法接收数据,并使用`dev.close()`方法关闭连接。 请注意,使用`pyusb`控制USB设备需要一些USB设备的相关知识,如设备的vendor id、product id、端点地址等。你需要查找并了解你要控制的具体USB设备的规格和协议。 希望这个例子能帮到你!如果有任何更多的问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值