使用C语言与libusb-1.0无法通过VID/PID打开USB设备的问题
问题描述
在Windows 10系统上使用C语言结合libusb-1.0处理USB设备时,已通过libusb_init()成功初始化库(返回值为0),但调用libusb_open_device_with_vid_pid()函数时,返回的libusb_device_handle始终为NULL。通过libusb_get_device_list()可以检测到Arduino Nano设备,且其VID和PID与Windows设备管理器中的信息一致。
以下是相关代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> #include <assert.h> #include "include/libusb-1.0/libusb.h" #define VID 0x1A86 #define PID 0x7523 int main(void) { int status = 0; libusb_device_handle* dev = NULL; system("cls"); printf("Initializing libusb...\n"); status = libusb_init(NULL); if(status != 0) { printf("\nCannot Initialize libusb!!\n"); return 0; } printf("\nlibusb Initialized Successfully...\n"); dev = libusb_open_device_with_vid_pid(NULL, VID, PID); if(dev == NULL) { printf("\nError!! Could Not Find USB Device!\n"); libusb_exit(NULL); return 0; } printf("\nUSB Device Found...\n"); libusb_exit(NULL); return 0; }
可能的原因及解决方法
- 设备驱动未绑定到libusb兼容驱动:Windows系统中,Arduino Nano默认使用串口驱动(如CH340驱动),而非libusb兼容的WinUSB或libusb-win32驱动。需替换驱动:
- 打开设备管理器,找到Arduino Nano对应的串口设备(如"Ports (COM & LPT)"下的"USB-SERIAL CH340")。
- 右键选择「更新驱动程序」→「浏览我的计算机以查找驱动程序软件」→「让我从计算机上的可用驱动程序列表中选取」。
- 选择「通用串行总线设备」→「WinUSB设备」完成安装;也可使用Zadig工具一键替换为WinUSB驱动。
- 权限不足:Windows下访问USB设备需要管理员权限。右键点击编译后的程序,选择「以管理员身份运行」测试,若能正常打开设备,说明是权限问题。可在项目中添加管理员权限清单,或每次运行时手动获取权限。
- 设备被其他进程占用:Arduino IDE、串口监视器、Putty等程序可能正在占用该设备,导致libusb无法打开。关闭所有可能占用设备的程序后重新运行。
- libusb版本或编译不匹配:确保使用的libusb-1.0是适配Windows的正确版本(32位/64位需与程序编译架构一致)。若自行编译libusb,检查编译选项;若使用预编译库,确认下载版本适配当前系统。
- 内核驱动独占设备:部分设备的内核驱动会独占设备,替换为WinUSB驱动后,原串口驱动会被替换,libusb才能正常访问设备。
内容的提问来源于stack exchange,提问作者Devashish Lahariya
相关产品推荐
相关产品推荐

