PyUSB 1.0 编程教程:轻松掌握Python USB设备通信
【免费下载链接】pyusb Easy USB access for Python 项目地址: https://gitcode.com/gh_mirrors/py/pyusb
前言:PyUSB项目简介
PyUSB是一个纯Python实现的USB设备访问库,它让开发者能够轻松地与USB设备进行交互。相比早期版本,PyUSB 1.0完全采用Python实现,无需C语言背景即可理解其工作原理。本教程将带你深入了解PyUSB的核心功能和使用方法。
PyUSB核心特性
- 纯Python实现:完全用Python编写,降低了理解和使用门槛
- 平台中立性:采用前端-后端架构设计,支持多种底层实现
- 跨平台支持:支持Python 3.9及以上版本,依赖ctypes模块
- 简化USB通信:为常见配置提供了合理的默认值
- 同步传输支持:支持底层后端提供的同步传输功能
快速入门:第一个PyUSB程序
以下是一个简单的示例程序,演示如何向找到的第一个OUT端点发送"test"字符串:
import usb.core
import usb.util
# 查找指定设备
dev = usb.core.find(idVendor=0xfffe, idProduct=0x0001)
if dev is None:
raise ValueError('设备未找到')
# 设置活动配置(默认使用第一个配置)
dev.set_configuration()
# 获取端点实例
cfg = dev.get_active_configuration()
intf = cfg[(0,0)]
ep = usb.util.find_descriptor(
intf,
custom_match=lambda e:
usb.util.endpoint_direction(e.bEndpointAddress) ==
usb.util.ENDPOINT_OUT)
assert ep is not None
# 写入数据
ep.write('test')
设备查找与枚举
PyUSB提供了强大的设备查找功能,可以根据各种条件查找USB设备:
# 查找特定设备
dev = usb.core.find(idVendor=0xfffe, idProduct=0x0001)
# 查找所有打印机设备
printers = usb.core.find(find_all=True, bDeviceClass=7)
对于更复杂的查找条件,可以使用自定义匹配函数:
class find_class(object):
def __init__(self, class_):
self._class = class_
def __call__(self, device):
if device.bDeviceClass == self._class:
return True
for cfg in device:
intf = usb.util.find_descriptor(cfg, bInterfaceClass=self._class)
if intf is not None:
return True
return False
# 查找所有打印机
printers = usb.core.find(find_all=1, custom_match=find_class(7))
设备描述符访问
PyUSB提供了直观的方式来访问设备的各种描述符信息:
# 访问设备描述符字段
print(dev.bLength)
print(dev.bNumConfigurations)
# 遍历配置、接口和端点
for cfg in dev:
print(f"配置: {cfg.bConfigurationValue}")
for intf in cfg:
print(f" 接口: {intf.bInterfaceNumber}")
for ep in intf:
print(f" 端点: {ep.bEndpointAddress}")
设备配置与接口设置
在使用USB设备前,通常需要进行配置和接口设置:
# 设置配置(使用第一个找到的配置)
dev.set_configuration()
# 设置接口替代设置
dev.set_interface_altsetting(interface=0, alternate_setting=0)
数据传输操作
PyUSB支持四种USB传输类型:
- 控制传输:使用
ctrl_transfer方法 - 批量传输:使用
write和read方法 - 中断传输:同样使用
write和read方法 - 同步传输:如果后端支持
控制传输示例:
# 控制传输示例
msg = 'test'
dev.ctrl_transfer(0x40, CTRL_LOOPBACK_WRITE, 0, 0, msg)
ret = dev.ctrl_transfer(0xC0, CTRL_LOOPBACK_READ, 0, 0, len(msg))
批量传输示例:
# 批量写入
ep.write('test')
# 批量读取
data = ep.read(64) # 读取最多64字节
错误处理与调试
PyUSB使用异常处理错误,并提供了日志功能:
try:
dev.set_configuration()
except usb.core.USBError as e:
print(f"USB错误: {e}")
# 启用调试日志(通过环境变量)
# 设置PYUSB_DEBUG为debug/info/warning/error/critical
# 设置PYUSB_LOG_FILENAME指定日志文件
高级主题
处理多个相同设备
当系统连接了多个相同设备时,可以通过总线号和设备地址区分:
dev1 = usb.core.find(idVendor=0xfffe, idProduct=0x0001, bus=1, address=2)
dev2 = usb.core.find(idVendor=0xfffe, idProduct=0x0001, bus=1, address=3)
接口与替代设置
理解接口和替代设置对于复杂设备非常重要:
# 获取特定接口的替代设置
intf = cfg[(0,1)] # 接口0,替代设置1
# 设置活动替代设置
intf.set_altsetting()
最佳实践
- 总是检查设备是否成功找到
- 合理处理USBError异常
- 在不需要时释放接口
- 使用上下文管理器管理资源
- 对于生产代码,添加充分的错误处理
结语
PyUSB为Python开发者提供了强大而简单的USB设备访问能力。通过本教程,你应该已经掌握了PyUSB的核心概念和基本使用方法。对于更复杂的应用场景,建议参考USB协议规范和PyUSB的详细文档。
记住,USB是一个复杂的协议,PyUSB虽然简化了访问过程,但理解USB基础知识对于开发可靠的USB应用程序仍然至关重要。
【免费下载链接】pyusb Easy USB access for Python 项目地址: https://gitcode.com/gh_mirrors/py/pyusb
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



