请求实现串口输入下的按键映射触发功能程序方案
串口与键盘按键映射解决方案
基于给定的功能-按键映射字典,可实现键盘按键触发对应功能(通过串口发送指令)或串口接收指令模拟按下对应键盘按键的双向交互功能,以下是具体实现方案:
1. 预处理映射字典
原字典为「功能→按键」的映射,且存在一个按键对应多个功能的情况(如's'对应Start Case和Audio)。我们需要生成两个映射表以适配不同场景:
- 保留原字典用于「串口指令→键盘按键」的转换
- 生成反转字典「按键→功能列表」用于「键盘按键→串口指令」的转换
# 原始功能-按键映射字典 d_key_events_mapped = { 'Start Case': 's', 'Alarm': 'a', 'Checkout': 'c', 'Endcase': 'e', 'Shutdown': 'F12', 'Procedure': 'p', 'Audio': 's', 'Trends': 't', 'Screen setup': 'u', 'System setup': 'w', 'Spirometry': 'y', 'Auto': 'y', 'Vent': 'v', 'TV': 'F2' } # 生成按键→功能列表的反转映射 d_key_to_functions = {} for func, key in d_key_events_mapped.items(): if key not in d_key_to_functions: d_key_to_functions[key] = [] d_key_to_functions[key].append(func)
2. 场景一:键盘按键触发串口发送功能指令
使用pynput监听键盘输入,按下对应按键时,通过串口发送所有关联的功能指令。
代码实现
import serial from pynput.keyboard import Listener, Key # 配置串口参数(根据实际设备调整) ser = serial.Serial( port='COM3', # Windows用COMx,Linux用/dev/ttyUSBx baudrate=9600, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=1 ) def on_press(key): try: # 处理普通字符按键 key_char = key.char.lower() if key_char in d_key_to_functions: for func in d_key_to_functions[key_char]: # 发送功能指令到串口,末尾加换行符作为结束符 ser.write(f"{func}\n".encode('utf-8')) print(f"已发送指令: {func}") except AttributeError: # 处理特殊按键(如F12、F2) key_name = str(key).split('.')[-1] if key_name in d_key_to_functions: for func in d_key_to_functions[key_name]: ser.write(f"{func}\n".encode('utf-8')) print(f"已发送指令: {func}") def on_release(key): # 按ESC退出监听 if key == Key.esc: ser.close() return False # 启动键盘监听 with Listener(on_press=on_press, on_release=on_release) as listener: listener.join()
3. 场景二:串口接收指令模拟按下键盘按键
使用pyserial读取串口数据,收到功能指令时,模拟按下对应的键盘按键。
代码实现
import serial from pynput.keyboard import Controller, Key keyboard = Controller() ser = serial.Serial( port='COM3', baudrate=9600, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=1 ) def simulate_key_press(key_str): # 映射特殊功能键 special_keys = { 'F1': Key.f1, 'F2': Key.f2, 'F3': Key.f3, 'F4': Key.f4, 'F5': Key.f5, 'F6': Key.f6, 'F7': Key.f7, 'F8': Key.f8, 'F9': Key.f9, 'F10': Key.f10, 'F11': Key.f11, 'F12': Key.f12 } if key_str in special_keys: keyboard.press(special_keys[key_str]) keyboard.release(special_keys[key_str]) else: # 处理普通字符按键 keyboard.press(key_str) keyboard.release(key_str) print(f"已模拟按键: {key_str}") try: while True: # 读取串口数据(按换行符分割) line = ser.readline().decode('utf-8').strip() if line in d_key_events_mapped: key = d_key_events_mapped[line] simulate_key_press(key) except KeyboardInterrupt: ser.close()
依赖安装
需安装两个Python库:
pip install pyserial pynput
注意事项
- 串口参数(端口、波特率等)需根据实际连接的设备调整
- 特殊按键的映射可根据
pynput的Key类扩展(如需要添加方向键、回车键等) - 串口指令的结束符可根据实际需求修改(如用
\r\n或自定义分隔符)
内容的提问来源于stack exchange,提问作者Santhiya Yuvaraj
相关产品推荐
相关产品推荐

