Arduino用HID Project库开发自定义键盘:按键数组KEY_类键值调用失效
核心问题定位
所有异常的根源是数组类型选择错误,叠加HID-Project库的函数重载规则,完全匹配你观察到的现象:
- 你定义按键映射数组时,将类型声明为
char,在Arduino平台上char默认是有符号8位整数类型 - HID-Project库的
Keyboard.press函数针对不同传入参数类型有两套独立的处理逻辑:- 当传入参数是char类型的可打印ASCII值时,库会自动将这个ASCII值转换为对应的HID Usage ID再发送(例如传入ASCII 44,就会触发逗号按键的输出)
- 当传入参数是库定义的
KeyboardKey类型(本质是无符号枚举类型的原生HID Usage ID,大量功能键值大于127)时,库会直接将这个值作为原生HID Usage ID发送,不做ASCII转换
- 你遇到的异常刚好是这个规则导致的连锁反应:
- 库中
KEY_SPACE的宏值是原生HID Usage ID 44(对应空格键),和逗号的ASCII码值完全相等。直接在代码中调用Keyboard.press(KEY_SPACE)时,因为这个宏的类型是库原生的无符号枚举KeyboardKey,函数会识别为原生HID键值,正常输出空格 - 当你把
KEY_SPACE的值存到char类型数组中,再取出来传给Keyboard.press时,取出的参数类型是char,函数会匹配ASCII处理分支,把44这个值当成逗号的ASCII码转换为对应HID Usage ID发送,最终输出逗号——和你实测的现象完全一致 - 对于
KEY_LEFT_SHIFT这类宏值大于128的修饰键,存入有符号char数组时还会发生整数截断,导致最终存储的数值完全错误,进一步加剧按键异常 - 你数组中的普通字符如'j'、'k'本身就是ASCII字符,刚好匹配char类型传入时的ASCII处理分支,因此这部分按键运行完全正常。
- 库中
具体修复操作
- 第一步:修改按键映射数组的类型,替换为和库原生键值一致的类型,避免触发错误的函数重载,同时防止大键值被截断。推荐直接使用库定义的
KeyboardKey类型,兼容性最好:
如果不想依赖库的自定义类型,也可以用无符号8位整数// 原错误定义 // char keys[2][2] = { // {KEY_SPACE,'j'}, // {'k',KEY_LEFT_SHIFT} // }; // 修正后的定义 KeyboardKey keys[2][2] = { {KEY_SPACE,'j'}, {'k',KEY_LEFT_SHIFT} };uint8_t替代,同样能解决类型匹配问题。 - 第二步:调整串口调试的打印逻辑,
KeyboardKey类型直接传给Serial.print会被识别为字符输出,调试时如果需要核对存储的真实键值,要强制转为整数类型打印,避免和实际字符输出混淆:// 原调试打印代码 // Serial.print(keys[i][j]); // 修正后的调试打印代码(输出真实数值,方便核对) Serial.print((int)keys[i][j]);
内容的提问来源于stack exchange,提问作者Oreo
相关产品推荐
相关产品推荐

