first commit

main
Dawn_Ocean 2023-10-19 20:25:01 +08:00
commit 90d6668280
3 changed files with 90 additions and 0 deletions

14
README.md 100644
View File

@ -0,0 +1,14 @@
# 按钮映射
## 说明
原用于德国心脏病的按钮共有 6 个,现编号为 A0 ~ A5。经 Zyme 调试后修复成功。现将其进行键盘映射以适应更广泛的需求。
## 功能
1. 程序运行后,会先检测当前连接的串口,并向 USB 串口发送 'C' 作为检验。该设备接收到大写字母 C 后会返回 `OK`
2. 程序开启对应串口,并等待初始化。
3. 程序读取文件夹中的键盘映射配置文件(具体格式附文件内),并构建映射表。
4. 程序开始循环读取串口输出内容,并映射为键盘对应键。
## 注意
1. 在程序初始化串口完毕前,请不要按动任何按钮。
2. 如果同时安装了 `serial``pyserial` 包,请先将这两个包都卸载,再单独安装 `pyserial` 包。
## 所需包
- `pyautogui`
- `pyserial` **(不是 `serial`**

13
keymap.txt 100644
View File

@ -0,0 +1,13 @@
# 这是用于构建按键映射的配置文件
# # 号后的内容均会被注释
# 文件以 '$' 号单独占一行结束,请勿删除
# 映射配置格式:[按钮编号]:[键位]
0 : Q
1 : W
2 : E
3 : R
4 : T
5 : Y
$

63
main.py 100644
View File

@ -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)