ch573F蓝牙鼠标绝对坐标在电脑上能用,在手机上就没反应

下面这个是 修改了hidmouseservice.c文件中uint8_t hidReportMap[]的报表

// HID Report Map characteristic value
static const uint8_t hidReportMap[] = {
        0x05, 0x01, // USAGE_PAGE (Generic Desktop) 用途页-桌面通用
        0x09, 0x02, // USAGE (Mouse)用途-鼠标
        0xa1, 0x01, // COLLECTION (Application)开集合-应用
        0x85, 0x02, //Report ID (178)
        0x09, 0x01, //   USAGE (Pointer)用途-指针
        0xa1, 0x00, //   COLLECTION (Physical)开集合-物理
        0x05, 0x09, //     USAGE_PAGE (Button)用途页-按键
        0x19, 0x01, //     USAGE_MINIMUM (Button 1)用途最小值-鼠标左键
        0x29, 0x03, //     USAGE_MAXIMUM (Button 3)用途最大值-鼠标中键
        0x15, 0x00, //     LOGICAL_MINIMUM (0)逻辑最小值-0:按键抬起
        0x25, 0x01, //     LOGICAL_MAXIMUM (1)逻辑最大值-1:按键按下
        0x95, 0x03, //     REPORT_COUNT (3)报告数量-3:3个按键
        0x75, 0x01, //     REPORT_SIZE (1)报告小组-1:1组
        0x81, 0x02, //     INPUT (Data,Var,Abs)数据输入:可变,独立,绝对值
        0x95, 0x01,//报告数量:1
        0x75, 0x05,//报告小组:5,为了和前面的3bit凑成一个字节
        0x81, 0x03,//数据输入:常量,独立,绝对值
        0x05, 0x01, //     USAGE_PAGE (Generic Desktop)用途页-桌面通用
        0x09, 0x30, //     USAGE (X)用途:X轴
        0x09, 0x31, //     USAGE (Y)用途:Y轴
        0x15, 0x00, //     LOGICAL_MINIMUM (0)逻辑最小值:0
        0x26, 0xff, 0x7f, //     LOGICAL_MAXIMUM (32767)逻辑最大值:32767,表示鼠标的左右、上下移动
        0x75, 0x10, //     REPORT_SIZE (16)报告数量:16 位
        0x95, 0x02, //     REPORT_COUNT (2)报告小组:2,X一个,Y一个,刚好两个
        0x81, 0x02, //     INPUT (Data,Var,Rel)数据输入:可变、独立、相对值
        0xc0,       //     END_COLLECTION
        0xc0        // END_COLLECTION
};

这个报表描述符由6字节组成,

  • BIT0:报表描述符的ID,固定位为0x02.

  • BIT1:bit0-bit2分别指示了鼠标左右中键的是否按下,其位高5位固定值为0。

  • BIT2-BIT3:代表当前指针的X坐标,取值范围为0-32767

  • BIT4-BIT5:代表当前指针的Y坐标,取值范围为0-32767

同时修改了

static void hidEmuSendMouseReport(uint8_t buttons, uint16_t X_data, uint16_t Y_data)
{
    uint8_t buf[HID_MOUSE_IN_RPT_LEN];

    buf[0] = 0x02; // Buttons
    buf[1] = buttons; //BIT0-BIT2分别指示了鼠标左右中键的是否按下,其位高5位固定值为0。
    buf[2] = (uint8_t)X_data;        // X axis data low 8bit
    buf[3] = (uint8_t)(X_data >> 8); // X axis data high 8bit
    buf[4] = (uint8_t)Y_data;        // Y axis data low 8bit
    buf[5] = (uint8_t)(Y_data >> 8); // Y axis data high 8bit
    HidDev_Report(HID_RPT_ID_MOUSE_IN, HID_REPORT_TYPE_INPUT,
                  HID_MOUSE_IN_RPT_LEN, buf);
}

在电脑上面是 可以实现 573f 输出绝对坐标的,

使用hidEmuSendMouseReport(0, 200, 200); 可以实现鼠标指针的 指定坐标跳转,而在手机上就没有反应了,


这是为什么呢,需要怎么修改

没有人解答吗


您好,您是在IOS还是安卓手机上测试的,IOS暂不支持绝对报表,安卓上实现光标绝对定位也不是走鼠标,是走HID TouchScreen协议,鼠标一般都用相对报表。另一方面手机屏幕的分辨率差别很大,使用相对鼠标也能减少适配分辨率的工作。


是在安卓手机上测试的,安卓上走HID Touch 实现了绝对坐标,在IOS上面确实是 HID touch不支持,

用鼠标相对坐标报表,在安卓和iOS上面都能用,看来 只能用相对报表了


IOS上只能用相对鼠标,自己构建一个XY坐标系,用相对鼠标来实现绝对鼠标的效果


只有登录才能回复,可以选择微信账号登录