You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求实现串口输入下的按键映射触发功能程序方案

串口与键盘按键映射解决方案

基于给定的功能-按键映射字典,可实现键盘按键触发对应功能(通过串口发送指令)或串口接收指令模拟按下对应键盘按键的双向交互功能,以下是具体实现方案:


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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 00:13:16