HID 扫描代码始终为 8 位。在这种情况下,诸如 left- CTRL+之类的键组合<,是“键修饰符”(left- 为 0x01 CTRL)和键码( 0x36 为<,)的序列。
虽然 0x0136 恰好是 310 10,但将多字节扫描码序列视为单个整数而不是字节序列是错误的,原因有很多:
- 机器架构的整数字节可能与为 HID 代码序列定义的不匹配,
- 在 HID 键盘报告中,它有一个键修饰符字节和最多六个键代码 - 用于最多 6 个常规键和八个修饰符位的组合,用于同时按下 shift、alt、ctrl 等组合,
- 在 HID 键盘报告中,在任何情况下,修饰符和第一个键码之间都有一个“保留”字节,因此无论机器字节顺序如何,0x01 和 0x36 在任何情况下都不连续。
在HID 扫描代码的情况下,您的 310 10实际上是两个字节 0x01 和 0x36(十六进制)。在谈论字节序列时,使用十六进制表示法更自然 - 特别是在修饰符的情况下,它是多个 shift/ctrl 等键的位掩码。0x36 代表键<,,0x01 是左键的修饰符CTRL。
如果您的值 310 在您将其分配给 16 位整数时被截断,则很可能您将其作为单个值传递给期望 a 的接口uint8_t
。但是如上所述,发送一个 16 位整数在任何情况下都是不正确的。
而不是发送 0x0136 或 310 10您需要发送一个字节序列来形成一个有效的键盘报告,如设备的键盘报告描述符所述。在 HID 键盘报告中,第一个字节是“修饰符掩码”(0x01/left- CTRL),第二个字节保留,然后最多有 6 个键码(允许多键组合)实际支持的键数因此报告的长度由报告描述符定义。
查看您链接的 HID 演示中的 API,但是很明显,所有这些都被抽象掉了,您实际需要做的似乎是:
uint8_t key = HID_KEY_COMMA ;
esp_hidd_send_keyboard_value( hid_conn_id, LEFT_CONTROL_KEY_MASK, &key, 1 ) ;
请注意,修饰符是一个位掩码,允许任何修饰键组合,例如LEFT_CONTROL_KEY_MASK|RIGHT_CONTROL_KEY_MASK
. HID 将使用它来指示多个班次,但接收器可能会使用它来允许无区别地使用左键或右键。