中国籍数学家实现菲尔兹奖突破! 王虹、邓煜双双获奖,这能给我们信奥赛学习的同学们带来什么启示
2026/7/25 2:39:47
pyusb库来探索USB设备。首先安装依赖:bashpip install pyusb### 3.2 枚举USB设备python# 示例1:枚举所有USB设备import usb.coreimport usb.utildef list_usb_devices(): """ 列出所有连接的USB设备信息 返回设备列表,每个设备包含:厂商ID、产品ID、描述符 """ # 查找所有USB设备 devices = usb.core.find(find_all=True) if not devices: print("未找到任何USB设备") return print("检测到以下USB设备:") print("-" * 50) for device in devices: # 获取设备描述符 try: # 尝试读取设备描述符 vendor_id = f"0x{device.idVendor:04x}" product_id = f"0x{device.idProduct:04x}" # 获取厂商和产品字符串(可能失败) try: manufacturer = usb.util.get_string(device, device.iManufacturer) except: manufacturer = "未知" try: product = usb.util.get_string(device, device.iProduct) except: product = "未知" print(f"厂商ID: {vendor_id}") print(f"产品ID: {product_id}") print(f"厂商: {manufacturer}") print(f"产品: {product}") print(f"总线地址: {device.bus}") print(f"设备地址: {device.address}") print("-" * 50) except usb.core.USBError as e: print(f"读取设备信息失败: {e}") print("-" * 50)if __name__ == "__main__": list_usb_devices()运行这个程序,你将看到类似下面的输出:检测到以下USB设备:--------------------------------------------------厂商ID: 0x8087产品ID: 0x0a2b厂商: Intel Corp.产品: 未知总线地址: 1设备地址: 2--------------------------------------------------### 3.3 深入探索:读取端点配置接下来,我们深入到一个特定设备,查看其端点配置:python# 示例2:分析特定USB设备的端点配置import usb.coreimport usb.utildef analyze_device(vendor_id, product_id): """ 分析特定USB设备的端点配置 参数: vendor_id: 厂商ID(整数) product_id: 产品ID(整数) """ # 查找设备 device = usb.core.find(idVendor=vendor_id, idProduct=product_id) if device is None: print(f"未找到设备 0x{vendor_id:04x}:0x{product_id:04x}") return print(f"设备 0x{vendor_id:04x}:0x{product_id:04x} 配置信息:") print("=" * 60) # 获取配置描述符 config = device.get_active_configuration() print(f"配置值: {config.bConfigurationValue}") print(f"接口数量: {config.bNumInterfaces}") print("-" * 60) # 遍历所有接口 for interface in config: print(f"接口编号: {interface.bInterfaceNumber}") print(f"接口类: 0x{interface.bInterfaceClass:02x}") print(f"接口子类: 0x{interface.bInterfaceSubClass:02x}") print(f"端点数量: {len(interface)}") # 遍历端点 for endpoint in interface: # 解析端点方向(IN/OUT) direction = "IN" if usb.util.endpoint_direction(endpoint.bEndpointAddress) == usb.util.ENDPOINT_IN else "OUT" # 解析传输类型 transfer_type = usb.util.endpoint_type(endpoint.bmAttributes) print(f" 端点地址: 0x{endpoint.bEndpointAddress:02x} ({direction})") print(f" 传输类型: {transfer_type}") print(f" 最大包长度: {endpoint.wMaxPacketSize} 字节") print("-" * 60) # 释放设备 usb.util.dispose_resources(device)if __name__ == "__main__": # 示例:分析一个HID设备(如鼠标/键盘) # 实际使用时,请替换为你的设备ID analyze_device(0x8087, 0x0a2b) # 示例ID,请根据实际情况修改## 高级用法:嵌入式开发中的USB编程### 4.1 设备描述符结构理解USB协议的核心是掌握各种描述符。以下是设备描述符的C语言结构:cstruct usb_device_descriptor { uint8_t bLength; // 描述符长度(18字节) uint8_t bDescriptorType; // 描述符类型(0x01表示设备描述符) uint16_t bcdUSB; // USB版本号(如0x0200表示USB 2.0) uint8_t bDeviceClass; // 设备类 uint8_t bDeviceSubClass; // 设备子类 uint8_t bDeviceProtocol; // 设备协议 uint8_t bMaxPacketSize0; // 端点0最大包长度 uint16_t idVendor; // 厂商ID uint16_t idProduct; // 产品ID uint16_t bcdDevice; // 设备版本号 uint8_t iManufacturer; // 厂商字符串索引 uint8_t iProduct; // 产品字符串索引 uint8_t iSerialNumber; // 序列号字符串索引 uint8_t bNumConfigurations; // 配置数量} __attribute__((packed));### 4.2 实际案例:USB转串口设备假设你正在调试一个USB转串口模块(如CH340或CP2102),你需要:1. 识别设备(通过厂商ID和产品ID)2. 配置串口参数(波特率、数据位等)3. 通过批量端点收发数据这个过程涉及USB协议的核心操作:-控制传输:发送设置命令(如配置串口参数)-批量传输:传输实际数据python# 示例3:与USB转串口设备通信(简化版)import usb.coreimport usb.util# 假设设备是CH340(厂商ID:0x1A86, 产品ID:0x7523)VENDOR_ID = 0x1A86PRODUCT_ID = 0x7523def setup_serial_device(): """配置USB转串口设备""" device = usb.core.find(idVendor=VENDOR_ID, idProduct=PRODUCT_ID) if device is None: raise ValueError("设备未找到") # 设置配置(通常只需要第一个配置) device.set_configuration() # 获取配置信息 config = device.get_active_configuration() # 找到批量传输端点 interface = config[(0, 0)] # (接口号, 备用设置) # 分离内核驱动(避免冲突) if device.is_kernel_driver_active(0): device.detach_kernel_driver(0) # 配置串口参数(通过控制传输) # 设置波特率:115200 baud_rate = 115200 # CH340的配置命令格式,具体请参考芯片手册 device.ctrl_transfer( bmRequestType=0x40, # 主机到设备,标准请求 bRequest=0x24, # 设置波特率命令 wValue=0x00, wIndex=0x00, data_or_wLength=bytes([baud_rate & 0xFF, (baud_rate >> 8) & 0xFF]) ) print("设备配置完成") return deviceif __name__ == "__main__": try: dev = setup_serial_device() print("成功初始化USB转串口设备") except Exception as e: print(f"初始化失败: {e}")## 学习USB协议的价值### 5.1 职业发展掌握USB协议开发的工程师在以下领域极具竞争力:- 嵌入式系统开发- 驱动开发(Linux/Windows)- IoT设备开发- 游戏外设设计### 5.2 技术深度学习USB协议能帮助你理解:- 计算机的I/O子系统工作原理- 中断、DMA等硬件机制- 协议栈的分层设计思想- 实时系统与数据流控制### 5.3 调试能力当USB设备出现问题时,理解协议能让你:- 使用USB协议分析仪(如Wireshark)抓包分析- 快速定位硬件或软件问题- 优化数据传输性能## 总结USB协议是现代计算机系统中最成功的外设接口标准之一。通过本文的学习,你从基础概念入手,理解了主机-设备架构、四种传输模式和端点-管道模型,并通过Python代码实践了设备枚举和配置分析。更重要的是,我们看到了USB协议在嵌入式开发和驱动开发中的实际应用场景。学习USB协议不仅是掌握一个接口标准,更是理解计算机系统设计思想的过程。从简单的设备枚举到复杂的批量传输,每一步都体现了协议设计的精妙之处。无论你是准备从事嵌入式开发,还是想深入理解计算机系统,USB协议都是值得投入时间学习的核心技术。下一步,建议你:1. 用Python程序分析你身边的各种USB设备2. 阅读USB 2.0规范文档(约650页,但前100页就足够入门)3. 尝试在微控制器上实现一个简单的USB HID设备记住:实践是最好的学习方式,拿起你的USB设备,开始探索吧!