打小我就狂 2024-02-02 11:01 采纳率: 0%
浏览 2

HUB监听USB插拔响应

(VS || QT):我有一个hub设备 设备上有8个接口都是TF卡槽 有做过类似的项目么?目前想实现的效果是监听这个hub拔插和hub下的TF卡拔插效果 比如:第一层hub的拔插可以处理全部TF拔出 第二层是hub插在电脑上 TF卡的插拔消息 其他USB接口不能影响到这8个接口。

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-02-02 11:03
    关注

    引自免费微信小程序:皆我百晓生

    在Qt中监听USB Hub设备及其挂载的TF卡插拔事件,你需要利用操作系统提供的USB事件通知机制,并通过Qt实现异步处理。这里我们主要讨论Windows平台下使用Qt进行这一操作的基本思路和代码框架。

    首先,确保你的程序具有足够的权限来接收USB设备插拔的通知。在Windows平台上,可以通过注册设备接口更改通知(Device Interface Change Notification)来监听USB设备的状态变化。然后结合Qt的QSocketNotifierQWinEventNotifier类来响应这些系统消息。

    以下是一个简化的步骤概述:

    1. 注册USB设备接口通知:

      • 使用Windows API函数如RegisterDeviceNotification()来注册对USB设备类GUID的通知,具体到你的Hub设备和TF卡槽。
    2. 创建并设置事件通知器:

      • 创建一个QWinEventNotifier实例,并关联到第一步得到的系统事件句柄。
      • 重写eventNotified()槽函数,在该函数中处理USB设备插入/移除的逻辑。
    3. 处理USB插拔事件:

      • eventNotified()中,解析传入的通知事件,判断是Hub本身还是挂载的TF卡发生了插拔操作,并根据需要采取相应动作。

    由于实际代码涉及到Windows API调用和Qt环境下的C++编程,且编写完整的可运行代码超出了本平台限制,以下仅提供关键部分伪代码示例:

    #include <windows.h>
    #include <dbt.h>
    #include <QWinEventNotifier>
    
    // 假设已定义了全局变量:
    HDEVNOTIFY hDevNotify;
    QWinEventNotifier* notifier;
    
    void registerUsbDeviceNotification(HWND hWnd)
    {
        DEV_BROADCAST_DEVICEINTERFACE filter = {0};
        filter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
        filter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
        // 这里填写USB Hub Class GUID,例如磁盘类设备接口GUID
        // 注意替换为你实际的Hub或TF卡槽对应的GUID
        filter.dbcc_classguid = GUID_DEVINTERFACE_USB_HUB; // 或者对应TF卡槽的GUID
    
        hDevNotify = RegisterDeviceNotification(hWnd, &filter, DEVICE_NOTIFY_WINDOW_HANDLE);
        if (hDevNotify == NULL) {
            // 处理错误
        }
    }
    
    void setupQtNotifier()
    {
        notifier = new QWinEventNotifier(hDevNotify, this);
        connect(notifier, &QWinEventNotifier::activated, this, &YourClass::eventNotified);
    }
    
    void YourClass::eventNotified()
    {
        MSG msg;
        while (PeekMessage(&msg, NULL, WM_DEVICECHANGE, WM_DEVICECHANGE, PM_REMOVE)) {
            switch (msg.message) {
            case WM_DEVICECHANGE:
                switch (msg.wParam) {
                case DBT_DEVICEARRIVAL: // 设备插入
                    handleDeviceArrival();
                    break;
                case DBT_DEVICEREMOVECOMPLETE: // 设备移除
                    handleDeviceRemove();
                    break;
                // ... 其他可能的消息处理
                default:
                    break;
                }
            }
        }
    }
    
    void YourClass::handleDeviceArrival()
    {
        // 检查设备类型是否为Hub或TF卡槽,然后执行相应的逻辑
    }
    
    void YourClass::handleDeviceRemove()
    {
        // 同上,检查设备类型并执行相应逻辑
    }
    

    请注意,上述代码仅为概念性演示,你需要依据实际情况填充正确的GUID以及完善具体的设备检测和区分逻辑。同时,为了能够正确识别Hub下的每个TF卡槽,你可能还需要进一步遍历和枚举设备层级关系以精确确定插拔的是哪个接口上的TF卡。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月2日

悬赏问题

  • ¥15 蓝桥oj3931,请问我错在哪里
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染