From 90d6668280013acd77358b5cd050d08128302512 Mon Sep 17 00:00:00 2001 From: Dawn_Ocean <1785590531@qq.com> Date: Thu, 19 Oct 2023 20:25:01 +0800 Subject: [PATCH] first commit --- README.md | 14 ++++++++++++ keymap.txt | 13 +++++++++++ main.py | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+) create mode 100644 README.md create mode 100644 keymap.txt create mode 100644 main.py diff --git a/README.md b/README.md new file mode 100644 index 0000000..a8c2a16 --- /dev/null +++ b/README.md @@ -0,0 +1,14 @@ +# 按钮映射 +## 说明 +原用于德国心脏病的按钮共有 6 个,现编号为 A0 ~ A5。经 Zyme 调试后修复成功。现将其进行键盘映射以适应更广泛的需求。 +## 功能 +1. 程序运行后,会先检测当前连接的串口,并向 USB 串口发送 'C' 作为检验。该设备接收到大写字母 C 后会返回 `OK`。 +2. 程序开启对应串口,并等待初始化。 +3. 程序读取文件夹中的键盘映射配置文件(具体格式附文件内),并构建映射表。 +4. 程序开始循环读取串口输出内容,并映射为键盘对应键。 +## 注意 +1. 在程序初始化串口完毕前,请不要按动任何按钮。 +2. 如果同时安装了 `serial` 与 `pyserial` 包,请先将这两个包都卸载,再单独安装 `pyserial` 包。 +## 所需包 +- `pyautogui` +- `pyserial` **(不是 `serial`)** \ No newline at end of file diff --git a/keymap.txt b/keymap.txt new file mode 100644 index 0000000..78d09c7 --- /dev/null +++ b/keymap.txt @@ -0,0 +1,13 @@ +# 这是用于构建按键映射的配置文件 +# ’#‘ 号后的内容均会被注释 +# 文件以 '$' 号单独占一行结束,请勿删除 +# 映射配置格式:[按钮编号]:[键位] + +0 : Q +1 : W +2 : E +3 : R +4 : T +5 : Y + +$ \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..a64dafd --- /dev/null +++ b/main.py @@ -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) \ No newline at end of file