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;
}
相关推荐
JosieBook3 分钟前
【C#语言】C#文件操作实战:动态路径处理与安全写入
开发语言·c#·io
小钊(求职中)3 分钟前
Lambda 和 Stream 从 0 到 1,从基础到实战
java·开发语言·后端·算法
米饭是菜qy3 分钟前
C++ 多线程简要讲解
linux·c++
嘤国大力士5 分钟前
C++11&QT复习 (六)
开发语言·c++·qt
带娃的IT创业者12 分钟前
《Python实战进阶》第33集:PyTorch 入门-动态计算图的优势
开发语言·pytorch·python
晴天Y2814 分钟前
通过php连接redis数据库
开发语言·php
Antonio91519 分钟前
【Q&A】外观模式在Qt中有哪些应用?
数据库·qt·外观模式
努力努力再努力wz21 分钟前
【c++入门系列】:引用以及内联函数详解
java·运维·服务器·c语言·开发语言·c++
chxii27 分钟前
3.1go流程控制语句
开发语言·后端·golang
雪碧聊技术32 分钟前
element-plus中el-empty空盒子组件和Collapse 折叠面板组件的使用
开发语言·前端·javascript