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)