You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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完成替换。
  • 手动通过设备管理器更新:
    1. 打开设备管理器,找到端口(COM和LPT)下的目标虚拟串口设备;
    2. 右键选择更新驱动程序 → 浏览我的计算机以查找驱动程序;
    3. 选择让我从计算机上的可用驱动程序列表中选取;
    4. 勾选显示所有设备,找到并选择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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 08:05:34