first commit
commit
90d6668280
|
|
@ -0,0 +1,14 @@
|
||||||
|
# 按钮映射
|
||||||
|
## 说明
|
||||||
|
原用于德国心脏病的按钮共有 6 个,现编号为 A0 ~ A5。经 Zyme 调试后修复成功。现将其进行键盘映射以适应更广泛的需求。
|
||||||
|
## 功能
|
||||||
|
1. 程序运行后,会先检测当前连接的串口,并向 USB 串口发送 'C' 作为检验。该设备接收到大写字母 C 后会返回 `OK`。
|
||||||
|
2. 程序开启对应串口,并等待初始化。
|
||||||
|
3. 程序读取文件夹中的键盘映射配置文件(具体格式附文件内),并构建映射表。
|
||||||
|
4. 程序开始循环读取串口输出内容,并映射为键盘对应键。
|
||||||
|
## 注意
|
||||||
|
1. 在程序初始化串口完毕前,请不要按动任何按钮。
|
||||||
|
2. 如果同时安装了 `serial` 与 `pyserial` 包,请先将这两个包都卸载,再单独安装 `pyserial` 包。
|
||||||
|
## 所需包
|
||||||
|
- `pyautogui`
|
||||||
|
- `pyserial` **(不是 `serial`)**
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
# 这是用于构建按键映射的配置文件
|
||||||
|
# ’#‘ 号后的内容均会被注释
|
||||||
|
# 文件以 '$' 号单独占一行结束,请勿删除
|
||||||
|
# 映射配置格式:[按钮编号]:[键位]
|
||||||
|
|
||||||
|
0 : Q
|
||||||
|
1 : W
|
||||||
|
2 : E
|
||||||
|
3 : R
|
||||||
|
4 : T
|
||||||
|
5 : Y
|
||||||
|
|
||||||
|
$
|
||||||
|
|
@ -0,0 +1,63 @@
|
||||||
|
import serial
|
||||||
|
import serial.tools.list_ports
|
||||||
|
|
||||||
|
from time import sleep
|
||||||
|
|
||||||
|
from pyautogui import keyDown, keyUp
|
||||||
|
|
||||||
|
com_init_time = 2 # 从端口初始化到写数据经历的时间,单位为秒
|
||||||
|
read_timeout = 0.4 # 读取串口的等待时间,单位为秒
|
||||||
|
baud_rate = 115200 # 波特率
|
||||||
|
|
||||||
|
def detect():
|
||||||
|
print("检测端口设备中...")
|
||||||
|
ports_list = list(serial.tools.list_ports.comports())
|
||||||
|
if len(ports_list) <= 0:
|
||||||
|
print("无目标串口设备。")
|
||||||
|
else:
|
||||||
|
for comport in ports_list:
|
||||||
|
if "USB" in list(comport)[1]:
|
||||||
|
ser = serial.Serial(port = list(comport)[0], baudrate = baud_rate, timeout = read_timeout)
|
||||||
|
sleep(com_init_time)
|
||||||
|
ser.write("C".encode("utf-8"))
|
||||||
|
response = str(ser.read(5), encoding = "utf-8")
|
||||||
|
ser.close()
|
||||||
|
if "OK" in response:
|
||||||
|
print("检测到如下串口设备:")
|
||||||
|
print(list(comport)[0], list(comport)[1])
|
||||||
|
return list(comport)[0]
|
||||||
|
print("无目标串口设备。")
|
||||||
|
return ""
|
||||||
|
|
||||||
|
def com_simulate(message):
|
||||||
|
print(message)
|
||||||
|
key = maps[int(message[1])] # 判断按下了哪个按钮
|
||||||
|
if 'U' in message:
|
||||||
|
keyUp(key)
|
||||||
|
elif 'D' in message:
|
||||||
|
keyDown(key)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
com_name = detect()
|
||||||
|
|
||||||
|
ser = serial.Serial(port = com_name, baudrate = baud_rate, timeout = read_timeout)
|
||||||
|
print("串口初始化中...")
|
||||||
|
sleep(com_init_time)
|
||||||
|
print("初始化完毕!")
|
||||||
|
|
||||||
|
print("读取并构建按键映射表中...")
|
||||||
|
maps = {}
|
||||||
|
with open('keymap.txt', 'r', encoding = "utf-8") as f:
|
||||||
|
line = f.readline().strip().split('#')[0] # 取出一行中 '#' 之前的部分,'#' 后为注释
|
||||||
|
while line != "$":
|
||||||
|
if line:
|
||||||
|
keymap = line.split(':')
|
||||||
|
maps[int(keymap[0].strip())] = keymap[1].strip()
|
||||||
|
line = f.readline().strip().split('#')[0]
|
||||||
|
print("构建完毕!")
|
||||||
|
|
||||||
|
# 检测按键循环体
|
||||||
|
while True:
|
||||||
|
message = str(ser.read(5), encoding = "utf-8")
|
||||||
|
if message:
|
||||||
|
com_simulate(message)
|
||||||
Loading…
Reference in New Issue