当前位置:首页 > C > 正文

C语言USB库入门指南(手把手教你用libusb实现USB设备通信)

在嵌入式系统、硬件控制和设备驱动开发中,C语言USB库扮演着至关重要的角色。如果你希望使用 C 语言与 USB 设备进行通信(比如读取U盘、控制USB摄像头、与自定义硬件交互等),那么掌握一个可靠的 USB 库是必不可少的。本文将带你从零开始,使用最流行的开源库 libusb,轻松实现 USB设备通信

C语言USB库入门指南(手把手教你用libusb实现USB设备通信) C语言USB库 libusb教程 USB设备通信 C语言嵌入式开发 第1张

什么是 libusb?

libusb 是一个跨平台的 C 语言库,用于与 USB 设备进行通信。它支持 Windows、Linux、macOS 等主流操作系统,无需编写内核驱动即可访问 USB 设备,非常适合 C语言嵌入式开发 和快速原型验证。

安装 libusb

在开始编码前,你需要先安装 libusb 开发库:

  • Ubuntu/Debian
    sudo apt-get install libusb-1.0-0-dev
  • CentOS/Fedora
    sudo yum install libusb1-devel
  • Windows:可从 libusb 官网 下载预编译的二进制文件,并配置到你的 IDE(如 Visual Studio)中。

第一个 libusb 程序:列出所有 USB 设备

下面是一个简单的 C 程序,使用 C语言USB库(libusb)遍历并打印系统中所有 USB 设备的厂商 ID(VID)和产品 ID(PID):

#include <libusb-1.0/libusb.h>#include <stdio.h>int main() {    libusb_context *ctx = NULL;    libusb_device **devs;    ssize_t cnt;    int i = 0;    // 初始化 libusb 上下文    int r = libusb_init(&ctx);    if (r < 0) {        fprintf(stderr, "无法初始化 libusb\n");        return 1;    }    // 获取设备列表    cnt = libusb_get_device_list(ctx, &devs);    if (cnt < 0) {        fprintf(stderr, "无法获取设备列表\n");        libusb_exit(ctx);        return 1;    }    // 遍历设备    while (devs[i] != NULL) {        struct libusb_device_descriptor desc;        libusb_get_device_descriptor(devs[i], &desc);        printf("设备 [%d]: VID=0x%04x, PID=0x%04x\n",               i, desc.idVendor, desc.idProduct);        i++;    }    // 释放资源    libusb_free_device_list(devs, 1);    libusb_exit(ctx);    return 0;}  

编译与运行

将上述代码保存为 list_usb.c,然后使用以下命令编译(Linux/macOS):

gcc -o list_usb list_usb.c -lusb-1.0

运行程序(可能需要 root 权限才能访问某些设备):

sudo ./list_usb

常见问题与权限设置

在 Linux 上,普通用户可能没有权限访问 USB 设备。你可以通过创建 udev 规则解决:

  1. 创建文件 /etc/udev/rules.d/99-usb-permissions.rules
  2. 添加一行(以 VID=0x1234 为例):
    SUBSYSTEM=="usb", ATTR{idVendor}=="1234", MODE="0666"
  3. 重新加载规则:sudo udevadm control --reload-rules && sudo udevadm trigger

结语

通过本教程,你已经掌握了如何使用 libusb教程 中的基础知识来枚举 USB 设备。这是 USB设备通信 的第一步。后续你可以学习如何打开特定设备、声明接口、进行批量传输(bulk transfer)或控制传输(control transfer),从而实现更复杂的 C语言嵌入式开发 功能。

记住,C语言USB库(如 libusb)是连接软件与硬件世界的桥梁。多动手实践,你将能构建出强大的 USB 控制应用!