为何LibUSB可连接STLINK-V2却无法连接ST虚拟串口(CDC类)?
解决LibUSB无法连接STMicroelectronics Virtual COM Port的问题
核心原因
Windows系统中,ST的Virtual COM Port属于CDC类设备,默认会被系统自带的usbser.sys驱动接管,而LibUSB需要设备使用WinUSB驱动才能直接访问USB原始端点。这也是QT能正常连接的原因——QT调用的是系统串口API,走的是驱动模拟的COM端口路径,而非直接访问USB设备。
解决步骤
1. 替换设备驱动为WinUSB
这是最关键的一步,操作方式有两种:
- 使用Zadig工具(推荐):
打开Zadig,在设备列表中找到STMicroelectronics Virtual COM Port(注意区分STLINK-V2),在右侧驱动选择框中选WinUSB,点击Install Driver完成替换。 - 手动通过设备管理器更新:
- 打开设备管理器,找到
端口(COM和LPT)下的目标虚拟串口设备; - 右键选择
更新驱动程序→浏览我的计算机以查找驱动程序; - 选择
让我从计算机上的可用驱动程序列表中选取; - 勾选
显示所有设备,找到并选择WinUSB Device完成安装。
- 打开设备管理器,找到
2. 改用枚举设备的方式连接(替代直接用libusb_open_device_with_vid_pid)
有些情况下,即使驱动正确,直接调用libusb_open_device_with_vid_pid也可能无法打开,这时候可以通过枚举所有设备并匹配VID/PID,再处理CDC类的接口:
libusb_device **dev_list; ssize_t dev_count = libusb_get_device_list(ctx, &dev_list); if (dev_count < 0) { // 处理设备列表获取失败错误 return; } libusb_device_handle *dev_handle = nullptr; for (ssize_t i = 0; i < dev_count; ++i) { libusb_device *dev = dev_list[i]; libusb_device_descriptor dev_desc; int ret = libusb_get_device_descriptor(dev, &dev_desc); if (ret != 0) continue; // 匹配目标设备的VID和PID if (dev_desc.idVendor == 1155 && dev_desc.idProduct == 22336) { ret = libusb_open(dev, &dev_handle); if (ret == 0) { // CDC类设备通常包含通信接口(CLASS_COMM)和数据接口(CLASS_DATA) struct libusb_config_descriptor *config_desc; ret = libusb_get_config_descriptor(dev, 0, &config_desc); if (ret == 0) { for (int j = 0; j < config_desc->bNumInterfaces; ++j) { const struct libusb_interface *iface = &config_desc->interface[j]; uint8_t iface_class = iface->altsetting[0].bInterfaceClass; // 声明接口,确保LibUSB能访问 if (iface_class == LIBUSB_CLASS_COMM || iface_class == LIBUSB_CLASS_DATA) { ret = libusb_claim_interface(dev_handle, j); if (ret != 0) { // 处理接口声明失败错误 } } } libusb_free_config_descriptor(config_desc); } break; } } } libusb_free_device_list(dev_list, 1); // 后续使用dev_handle进行数据收发
3. 验证权限(可选)
确保你的程序以管理员权限运行,虽然WinUSB驱动通常不需要额外权限,但部分情况下权限不足会导致设备无法打开。
内容的提问来源于stack exchange,提问作者euraad
相关产品推荐
相关产品推荐

