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

Arduino UNO HID键盘按键码异常,红外遥控控制PC出现Ctrl误触

问题分析

你的核心问题是HID键盘报告格式不符合USB标准,导致系统误识别修饰键(Ctrl):

  1. 标准USB HID键盘报告共8字节,结构为:
    • 第0字节:修饰键掩码(Ctrl/Shift/Alt等,0x00表示无修饰键)
    • 第1字节:保留位,必须为0
    • 第2-6字节:按键扫描码(最多同时发送6个按键,使用USB HID标准扫描码)
    • 第7字节:保留位,必须为0
  2. 你直接给buf[2]赋值0x80,这不是有效的按键扫描码,系统会解析出异常的修饰键状态;
  3. releaseKey函数仅重置了buf[0]和buf[2],未清空其他字节,残留的无效值可能导致系统误判。
修正方案

1. 清理重复头文件

移除重复的<IRremote.h>,保留<IRremote.hpp>即可,避免编译冲突。

2. 修正HID报告逻辑

使用标准USB HID扫描码,确保每次发送报告前正确初始化,释放时清空整个报告:

#include <IRremote.hpp>
#include <HID.h>

int RECV_PIN = 7;
// 初始化全0的标准HID报告
uint8_t hidReport[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

void setup() {
  Serial.begin(9600);
  IrReceiver.begin(RECV_PIN, ENABLE_LED_FEEDBACK);
  delay(200);
}

void loop() {
  if (IrReceiver.decode()) {
    int command = IrReceiver.decodedIRData.command;
    IrReceiver.stop();  

    switch (command) {
      case 70:
        Serial.println("Volume +");
        // 设置媒体键"音量+"的USB HID扫描码(标准值为0xE9)
        hidReport[2] = 0xE9;
        sendHidReport();
        break;
      // 其他按键案例示例
      // case XXX:
      //   Serial.println("播放/暂停");
      //   hidReport[2] = 0xCD; // 播放/暂停的HID扫描码
      //   sendHidReport();
      //   break;
    }

    releaseAllKeys();
    delay(500);
    IrReceiver.start(8000);
    IrReceiver.resume();
  }
}

// 发送HID报告到PC
void sendHidReport() {
  Serial.write(hidReport, 8);
}

// 释放所有按键,发送全0报告确保系统收到释放信号
void releaseAllKeys() {
  memset(hidReport, 0x00, sizeof(hidReport));
  Serial.write(hidReport, 8);
}

3. 关键说明

  • USB HID扫描码规则:不能使用ASCII码,必须用标准扫描码。比如媒体键类:音量+是0xE9、音量-是0xEA、播放/暂停是0xCD;标准按键类:A键是0x04、左Ctrl是0x01。
  • 修饰键组合处理:如果需要发送组合键(如Ctrl+C),只需修改第0字节的掩码,例如hidReport[0] = 0x01;(左Ctrl激活),同时hidReport[2] = 0x06;(C键扫描码)。
  • 报告完整性:每次操作后必须发送全0报告,避免系统残留按键按下的状态,这是解决误判修饰键的核心步骤。

额外排查点

  • 确认你的Arduino UNO模拟HID的方案(如V-USB)配置正确,串口波特率需与HID模拟工具的要求匹配;
  • 测试时可先发送简单按键(如A键,扫描码0x04),验证输入正常后再扩展到媒体键功能。

内容的提问来源于stack exchange,提问作者Jonah.Checketts

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 12:55:17