【免费下载】 PyUSB 1.0 编程教程:轻松掌握Python USB设备通信

PyUSB 1.0 编程教程:轻松掌握Python USB设备通信

【免费下载链接】pyusb Easy USB access for Python 【免费下载链接】pyusb 项目地址: https://gitcode.com/gh_mirrors/py/pyusb

前言:PyUSB项目简介

PyUSB是一个纯Python实现的USB设备访问库,它让开发者能够轻松地与USB设备进行交互。相比早期版本,PyUSB 1.0完全采用Python实现,无需C语言背景即可理解其工作原理。本教程将带你深入了解PyUSB的核心功能和使用方法。

PyUSB核心特性

  1. 纯Python实现:完全用Python编写,降低了理解和使用门槛
  2. 平台中立性:采用前端-后端架构设计,支持多种底层实现
  3. 跨平台支持:支持Python 3.9及以上版本,依赖ctypes模块
  4. 简化USB通信:为常见配置提供了合理的默认值
  5. 同步传输支持:支持底层后端提供的同步传输功能

快速入门:第一个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传输类型:

  1. 控制传输:使用ctrl_transfer方法
  2. 批量传输:使用writeread方法
  3. 中断传输:同样使用writeread方法
  4. 同步传输:如果后端支持

控制传输示例:

# 控制传输示例
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()

最佳实践

  1. 总是检查设备是否成功找到
  2. 合理处理USBError异常
  3. 在不需要时释放接口
  4. 使用上下文管理器管理资源
  5. 对于生产代码,添加充分的错误处理

结语

PyUSB为Python开发者提供了强大而简单的USB设备访问能力。通过本教程,你应该已经掌握了PyUSB的核心概念和基本使用方法。对于更复杂的应用场景,建议参考USB协议规范和PyUSB的详细文档。

记住,USB是一个复杂的协议,PyUSB虽然简化了访问过程,但理解USB基础知识对于开发可靠的USB应用程序仍然至关重要。

【免费下载链接】pyusb Easy USB access for Python 【免费下载链接】pyusb 项目地址: https://gitcode.com/gh_mirrors/py/pyusb

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值