CH9329控制键盘的正确食用方式
一、CH9329控制键盘介绍
1.推送的数据结构
帧头 | 地址码 | 命令码 | 后续数据长度 | 后续数据 | 累加和 |
---|---|---|---|---|---|
HEAD | ADDR | CMD | LEN | DATA | SUM |
0x57,0xAB | 0x00 | 0x02 | 0x08 | 8位 | 0x?? |
对于键盘控制来说,帧头、地址码、命令码、后续数据长度都是固定的。我们只需要填入后续数据跟累加和值即可。
2.累加和的计算
SUM = (HEAD + ADDR + CMD + LEN + DATA) % 256
需要注意的是,累加和计算时,需要将累加和计算结果取模。相当于16进制只取两位数
二、控制逻辑
1.python
- 单独的按键按下弹起
2.CH9329
- 按下
只发送8+6的组合键
- 弹起
在测试的过程中发现,如果我先推送按下AB键在不推送全部弹起的情况下,再推送A键。那么B键就会弹起。
通过按键监听,过程大概就是这样
send(['a', 'b']) # 监听到AB键按下
send(['a']) # 监听到B键弹起
send([]) # 监听到A键弹起
send(['a']) # 监听到A键按下
send(['b']) # 监听到A键弹起和B键按下
send([]) # 监听到B键弹起
你想要同时按下多个键,你需要发送8+6的组合键。而不是给CH9329推两次数据。推两次数据他只会按后面推送的按键。
假如你的需求是同时按下AB键,并且单独弹起B,那么你推送的数据应该是这个样子
send(['a', 'b', '0', '0', '0', '0', '0', '0'])
send(['a', '0', '0', '0', '0', '0', '0', '0']) # 将B键对应的数据置0
在8个数据位中将你想弹起的键对应的数据置0即可。
三、简单推送代码实现
import serial
import time
a = 0x04 # CH9329的A键对应的键码
b = 0x05 # CH9329的B键对应的键码
head = [0x57, 0xAB] # 帧头
addr = [0x00] # 地址码
cmd = [0x02] # 命令码
length = [0x08] # 后续数据长度
# 请根据实际情况修改串口号和波特率
ser = serial.Serial('COM6', 9600, timeout=1)
def send(key_code):
data = [] # 后续数据
# 填充数据部分,始终保持8个字节
for i in range(8):
if len(key_code) > i:
data.append(key_code[i])
continue
data.append(0x00)
# 计算累加和
footer = [(sum(head) + sum(addr) + sum(cmd) + sum(length) + sum(data)) % 256]
# 结合所有部分构造完整的命令包
command_packet = head + addr + cmd + length + data + footer
ser.write(bytes(command_packet)) # 发送数据
ser.flush() # 确保数据被发送
send([a, b]) # 按下"AB"
time.sleep(1)
send([a]) # 弹起"B"
time.sleep(1)
send([]) # 弹起"A"
附常用键码
键名 | 键码 | 键名 | 键码 | 键名 | 键码 |
---|---|---|---|---|---|
Q | 0x14 | H | 0x0B | RIGHT | 0x4F |
W | 0x1A | J | 0x0D | F1 | 0x3A |
E | 0x08 | K | 0x0E | F2 | 0x3B |
R | 0x15 | L | 0x0F | F3 | 0x3C |
T | 0x17 | Z | 0x1D | F4 | 0x3D |
Y | 0x1C | X | 0x1B | F5 | 0x3E |
U | 0x18 | C | 0x06 | F6 | 0x3F |
I | 0x0C | V | 0x19 | F7 | 0x40 |
O | 0x12 | B | 0x05 | F8 | 0x41 |
P | 0x13 | N | 0x11 | F9 | 0x42 |
A | 0x04 | M | 0x10 | F10 | 0x43 |
S | 0x16 | UP | 0x52 | F11 | 0x44 |
D | 0x07 | DOWN | 0x51 | F12 | 0x45 |
F | 0x09 | LEFT | 0x50 | ESC | 0x29 |
G | 0x0A |