Windows下如何获取BBC micro:bit v2的正确USB设备描述?
BBC micro:bit v2 设备描述获取问题解决方案
Chrome 如何获取正确设备描述
Chrome 的 Web Serial API 并非通过 Windows 系统的串口抽象层(如 Win32_SerialPort)获取信息,而是直接与 USB 设备底层通信,读取USB 设备描述符中的原始字符串:
- micro:bit v2 的 CSMIS-DAP 接口属于 USB CDC-ACM 类设备,本身在 USB 硬件层面携带了厂商(BBC)和产品(micro:bit CSMIS-DAP)的字符串描述符。
- Windows 默认给这类设备加载的「USB Serial Device」驱动,仅提供基础串口功能,不会将 USB 底层的设备信息映射到系统串口属性中;而 Web Serial API 绕过了这个驱动的抽象,直接读取 USB 原始描述,因此能显示正确名称。
Python 在 Windows 下获取正确设备信息的方法
方法1:直接访问 USB 设备层(推荐)
通过 pyusb 直接读取 USB 设备的原始描述符,需要先替换设备驱动为 libusb 兼容驱动:
- 安装依赖:
pip install pyusb - 用 Zadig 工具将 micro:bit 的「USB Serial Device」驱动替换为 libusb-win32 或 libusbK(确保选中对应 COM 口的 USB 父设备)。
- 编写代码枚举设备并读取信息:
import usb.core import usb.util # micro:bit v2 CSMIS-DAP 的 VID 和 PID VID = 0x0D28 PID = 0x0204 # 查找设备 device = usb.core.find(idVendor=VID, idProduct=PID) if device is None: raise ValueError("未找到 micro:bit 设备") # 获取厂商和产品字符串 manufacturer = usb.util.get_string(device, device.iManufacturer) product = usb.util.get_string(device, device.iProduct) print(f"厂商: {manufacturer}") print(f"产品: {product}")
方法2:通过 Windows SetupAPI 关联串口与 USB 设备
如果不想替换驱动,可以通过 pywin32 调用 Windows API,找到对应 COM 口关联的 USB 设备,读取其原始信息:
- 安装依赖:
pip install pywin32 - 核心思路:
- 枚举所有串口设备,通过设备实例 ID 找到对应的 USB 父设备。
- 读取 USB 父设备的硬件描述字符串(包含 micro:bit 相关信息)。
示例代码(简化版):
import win32com.client wmi = win32com.client.GetObject("winmgmts:") # 枚举所有串口设备 for port in wmi.InstancesOf("Win32_SerialPort"): if "USB" in port.PNPDeviceID: # 从PNPDeviceID中提取USB设备路径,进一步查询 usb_dev_path = port.PNPDeviceID.split("\\")[1] # 枚举USB设备匹配路径 for usb_dev in wmi.InstancesOf("Win32_USBControllerDevice"): if usb_dev.Dependent.endswith(usb_dev_path): parent_dev = wmi.Get(usb_dev.Antecedent) print(f"COM口: {port.DeviceID}") print(f"设备描述: {parent_dev.Description}")
注意事项
- micro:bit v2 有两个 USB 接口:一个是 CSMIS-DAP(串口,PID 0x0204),另一个是 Mass Storage(U盘,PID 0x0200),注意区分 PID。
- 替换驱动后,原串口可能会暂时消失,重新插拔设备后会出现新的串口(由 libusb 驱动提供),不影响正常使用。
内容的提问来源于stack exchange,提问作者Aivar
相关产品推荐
相关产品推荐

