qt中libusb热插拔检测示例代码

qt中libusb热插拔检测示例代码

cpp 复制代码
#include <QCoreApplication>
#include <QDebug>
#include <libusb/libusb.h>

// 回调函数
int hotplugCallback(libusb_context *ctx, libusb_device *dev, libusb_hotplug_event event, void *user_data) {
    libusb_device_descriptor desc;
    if (libusb_get_device_descriptor(dev, &desc) != LIBUSB_SUCCESS) {
        qDebug() << "无法获取设备描述符";
        return 0;
    }

    uint8_t busNumber = libusb_get_bus_number(dev);
    uint8_t deviceAddress = libusb_get_device_address(dev);

    if (event == LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED) {
        qDebug() << "【设备插入】"
                 << "VID: " << QString::number(desc.idVendor, 16)
                 << ", PID: " << QString::number(desc.idProduct, 16)
                 << ", 总线号: " << busNumber
                 << ", 设备地址: " << deviceAddress;

        // 获取接口信息
        libusb_config_descriptor *config;
        if (libusb_get_active_config_descriptor(dev, &config) == LIBUSB_SUCCESS) {
            for (int i = 0; i < config->bNumInterfaces; i++) {
                const libusb_interface &interface = config->interface[i];
                for (int j = 0; j < interface.num_altsetting; j++) {
                    const libusb_interface_descriptor &altsetting = interface.altsetting[j];
                    qDebug() << "接口号: " << altsetting.bInterfaceNumber
                             << ", 端点数: " << altsetting.bNumEndpoints
                             << ", 类别: " << altsetting.bInterfaceClass;
                }
            }
            libusb_free_config_descriptor(config);
        }
    } else if (event == LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT) {
        qDebug() << "【设备拔出】"
                 << "VID: " << QString::number(desc.idVendor, 16)
                 << ", PID: " << QString::number(desc.idProduct, 16)
                 << ", 总线号: " << busNumber
                 << ", 设备地址: " << deviceAddress;
    }

    return 0;
}

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    // 初始化 libusb
    libusb_context *ctx = nullptr;
    if (libusb_init(&ctx) < 0) {
        qDebug() << "libusb 初始化失败";
        return 1;
    }
    qDebug() << "libusb 初始化成功";

    // 检查是否支持热插拔
    if (!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) {
        qDebug() << "当前系统不支持 USB 热插拔检测";
        libusb_exit(ctx);
        return 1;
    }

    // 注册热插拔回调
    libusb_hotplug_callback_handle callbackHandle;
    int result = libusb_hotplug_register_callback(ctx,
                                                   LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED | LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT,
                                                   LIBUSB_HOTPLUG_ENUMERATE,
                                                   LIBUSB_HOTPLUG_MATCH_ANY,
                                                   LIBUSB_HOTPLUG_MATCH_ANY,
                                                   LIBUSB_HOTPLUG_MATCH_ANY,
                                                   hotplugCallback,
                                                   nullptr,
                                                   &callbackHandle);

    if (result != LIBUSB_SUCCESS) {
        qDebug() << "注册回调失败: " << libusb_error_name(result);
        libusb_exit(ctx);
        return 1;
    }

    qDebug() << "USB 热插拔检测已启动...";

    // 循环处理事件
    while (true) {
        libusb_handle_events(ctx);
    }

    // 退出前释放资源
    libusb_hotplug_deregister_callback(ctx, callbackHandle);
    libusb_exit(ctx);
    return 0;
}
相关推荐
JiL 奥11 小时前
Nexus制品归档(c/c++项目)
c语言·c++
j4455661111 小时前
C++中的职责链模式实战
开发语言·c++·算法
m0_6860416111 小时前
实时数据流处理
开发语言·c++·算法
梵刹古音11 小时前
【C语言】 字符型变量
c语言·开发语言·嵌入式
草履虫建模11 小时前
A13 String 详解:不可变、常量池、equals 与 ==、性能与常见坑
java·开发语言·spring·jdk·intellij-idea·java基础·新手
知无不研11 小时前
内存碎片与内存优化
开发语言·c++·内存优化·内存碎片·内存操作
invicinble11 小时前
学习的门道和思路
java·开发语言·学习
m0_5613596711 小时前
C++模块接口设计
开发语言·c++·算法
矢志航天的阿洪12 小时前
从GitHub到本地:Python IGRF库环境配置完全指南
开发语言·python·github
从此不归路12 小时前
Qt5 进阶【11】图形视图框架:用 QGraphicsView 搭一个流程图编辑器
开发语言·c++·qt