You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32-S3 USB HID主机模式下读取鼠标滚轮数据方法咨询

ESP32 USB HID主机读取鼠标滚轮数据的实现方法
  • 第一步:确认鼠标的HID报告格式
    带滚轮的鼠标HID报告通常比基础鼠标多1字节数据(基础是3字节:按键状态、X轴位移、Y轴位移,带滚轮的会增加第4字节作为滚轮增量)。但不同厂商的鼠标可能有差异,建议先打印鼠标的HID报告描述符,确认滚轮数据的位置:

    // 在HID设备连接成功后,获取并打印报告描述符
    uint8_t desc[256];
    size_t desc_len = sizeof(desc);
    if (hid_host_get_report_descriptor(event->dev_addr, desc, &desc_len) == ESP_OK) {
        printf("HID Report Descriptor:\n");
        for (int i=0; i<desc_len; i++) {
            printf("%02X ", desc[i]);
            if ((i+1)%16 == 0) printf("\n");
        }
        printf("\n");
    }
    

    解析描述符时,找到Usage Page (Generic Desktop)和Usage (Wheel)对应的条目,查看它的Report Size和Report Offset,确定滚轮数据在报告中的位置。

  • 第二步:修改HID数据接收逻辑
    在HID主机的事件回调函数中,增加对滚轮数据的读取逻辑。如果报告长度符合带滚轮的格式,直接提取对应字节的数据:

    static void hid_host_event_callback(hid_host_event_t *event)
    {
        if (event->event == HID_HOST_EVENT_REPORT_RECEIVED) {
            uint8_t *report_data = event->data;
            size_t report_len = event->data_len;
    
            // 处理基础鼠标数据
            uint8_t mouse_buttons = report_data[0];
            int8_t x_move = report_data[1];
            int8_t y_move = report_data[2];
    
            // 读取滚轮数据(以4字节报告为例)
            if (report_len >= 4) {
                int8_t wheel_delta = report_data[3];
                // 滚轮非0时处理事件,正数表示向上滚动,负数表示向下滚动
                if (wheel_delta != 0) {
                    printf("Mouse wheel delta: %d\n", wheel_delta);
                    // 这里可以添加你的滚轮事件处理逻辑
                }
            }
        }
    }
    
  • 注意事项

    • 部分鼠标可能使用带报告ID的格式,此时报告的第一个字节是报告ID,滚轮数据会往后偏移1位,需要根据描述符调整读取位置。
    • 确保ESP-IDF版本兼容,建议使用v4.4及以上版本的HID主机API。
    • 如果鼠标有侧键等额外功能,报告长度可能更长,需根据实际描述符解析对应字段。

内容的提问来源于stack exchange,提问作者Alex villey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 09:52:40