Skip to content

串口协议(MAKCU) ​

📥 下载此API文档:serial-api.md

设备的 UART 串口(GPIO2/3,8N1)使用 MAKCU 协议族。设备开机默认 115200;主机先发送 DE AD 05 00 A5 <baud LE32> 握手帧,再切换到目标工作波特率(常用 4M)。握手、km.version()、km.baud(n) 和 V2 0xB1 属于传输控制,不受授权状态阻断;这样未激活设备仍能被网页发现、切速和连接。MAKCU 文本/V2 的实际键鼠注入、配置与调度命令受授权门控;网页使用的 55 AA 控制路径保持可用。运行期切速后重启恢复 115200。协议提供鼠标/键盘注入、连点、定时按压、字符串输入、平滑移动、按键锁定与物理输入屏蔽、状态遥测等能力。

与 HID 控制的区别 ​

HID(Device 模式)串口(MAKCU 协议)
物理链路PIO-USB-C 口的 HID OUT/IN 端点GPIO2/3 UART(经 USB-TTL 或板载转串口)
帧格式55 AA 命令帧(见 HIDAPI)km.* 文本、DE AD、0x50 V2、55 AA 私有扩展帧
命令集触屏 / 鼠标 / 键盘 / core_input 调度 / vmouse / Lua 自定义事件上述全部能力 + 连点 / 打字 / 平滑移动 / 锁定屏蔽 / 遥测
生态自定义上位机MAKCU 文本/V2 客户端;可使用仓库 pytester/test_makcu.py 回归

两个通道最终进入同一套设备控制路径,功能语义一致;区别只在传输与命令集广度。

握手与帧格式概要 ​

握手时以 115200 打开串口,发送:

DE AD 05 00 A5 <baud:uint32 little-endian>

设备不回复握手帧;主机等待短暂的 TX 排空时间后盲切到相同波特率。由于运行期可以用 km.baud(n) 改成任意支持值,健壮的上位机应逐档尝试已知速率,并在切到工作速率后发送 km.version() 确认,不能只凭握手帧判断成功。当前 Web Serial 工具依次探测 115200、921600、2000000、4000000,确认 km.MAKCU_V1.0 后才显示连接成功;若设备被改成探测表之外的自定义速率,需要把该速率加入客户端探测表。

工具提供「串口低延迟模式」开关(localStorage 记忆):开启后工作速率改用 6M(探测表末尾追加 6M 档,板子已被留在 6M 时重连无需重启)。6M 实测可用但可能出现不稳定;开关的生效点是连接时刻——会话中途切换会断开当前连接,提示用户重启开发板后重连(板子回到 115200 再由工具切到新速率)。文本命令以 \r 或 \n 结束,例如 km.version()、km.move(10,20)、km.baud()。V2 帧格式为 [50][CMD][LEN:u16 LE][payload];MAKCU 私有扩展帧格式为 [55][AA][LEN:u8][CMD][payload]。

按钮状态流(km.buttons) ​

km.buttons(mode[,period_ms]) 开启鼠标按钮状态流(物理 + 注入合并可见掩码,变化即上报)。位序 bit0=左 / bit1=右 / bit2=中 / bit3=侧1 / bit4=侧2,掩码恒 0x00–0x1F。本固件为事件驱动上报(掩码变化即发,不做周期采样),period_ms(1–1000)仅作参数兼容。

线上格式按 mode 区分(对齐官方 V4.036+ 语义):

mode流帧格式适用客户端
1 / 26B 6D 2E <mask> 0D 0A("km." + 掩码 + CRLF)现行官方固件形态;WhizKid 等"扫描 km. 前缀"的上位机只认这一种
3裸 <mask> 单字节老固件(V4.024–035)形态,保留给 makcu-py-lib 类旧解析客户端

km.axis(mode[,period_ms]) 的 mode 语义不变(仅 1/2)。

键盘数字注入(km.key) ​

km.key(code,state) 按数字 HID 码注入键盘(state:1=按下,0=释放)。code 接受 0x04–0x73(主键区至 F24)与 0xE0–0xE7(修饰键),其余值静默忽略但照常应答。按键名注入仍走 km.down('name') / km.up('name');两条路径相互独立(数字码不经过键名表与上档 shift 展开)。

55 AA 私有扩展帧 ​

串口保留 MAKCU 私有扩展帧 55 AA,格式与 HID 控制帧相同,用于把 HIDAPI 的控制指令复用到串口:

  • 帧格式:[55 AA][LEN][CMD][payload...],LEN 为 CMD 与 payload 的总长度
  • 例:55 AA 0E FC FF <dx:i32><dy:i32><wheel:i32> 注入一次相对移动
  • 固件收到后在设备侧重放同一控制路径,语义与 HID 通道一致

噪声处理说明 ​

串口只解析上述 MAKCU 帧型。无法组成完整帧的字节会按噪声消费;二进制半帧超过 50ms 未继续接收时复位解析状态。文本行必须以换行结束,非 km.* 文本静默消费。

示例 ​

text
115200: DE AD 05 00 A5 00 09 3D 00   # 请求切到 4000000
4000000: km.version()\r\n           # 收到 km.MAKCU_V1.0 才确认链路
4000000: km.baud(921600)\r\n          # 收到 ACK 后主机切到 921600
921600:  km.baud()\r\n