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

树莓派:无HDMI显示器时用键盘控制Bash脚本的方案问询

无HDMI连接时用本地键盘控制Bash脚本的解决方案

核心问题分析

你的脚本依赖read命令读取终端输入,但通过SSH启动时,脚本绑定的是远程终端;systemd/rc.local启动时,脚本没有关联到本地键盘对应的输入源,导致无法识别按键或接收无效输入。USB键盘的输入并非通过传统tty设备,而是位于/dev/input/目录下的事件设备。

可行解决方案

1. 定位本地键盘的输入设备

首先找到键盘对应的事件设备路径:

  • 安装工具:sudo apt install evtest
  • 运行evtest,会列出所有输入设备,找到标注为你的Jing-Mold键盘的条目,记录对应的/dev/input/eventX(X为数字)
  • 或者通过cat /proc/bus/input/devices查找,找到包含ID 05af:8277的段落,Handlers字段中的eventX即为设备路径

2. 修改脚本直接读取键盘事件

替换原有的read命令,直接从键盘输入设备读取按键事件,示例脚本:

#!/bin/bash
# 替换为你的键盘设备路径,或后续用udev固定的路径
KEYBOARD_DEV="/dev/input/eventX"

# 需root权限读取input设备
while true; do
    # 读取24字节的输入事件(标准input事件结构)
    read -r -n 24 EVENT < "$KEYBOARD_DEV"
    # 解析事件类型、按键码、状态(按下/释放)
    TYPE=$(echo "$EVENT" | od -t u4 -An | awk '{print $2}')
    CODE=$(echo "$EVENT" | od -t u4 -An | awk '{print $3}')
    VALUE=$(echo "$EVENT" | od -t u4 -An | awk '{print $4}')

    # 仅处理按键按下事件(TYPE=1为按键事件,VALUE=1为按下)
    if [ "$TYPE" -eq 1 ] && [ "$VALUE" -eq 1 ]; then
        case "$CODE" in
            10) 
                # 这里替换为你的VFD控制逻辑,比如发送串口命令
                echo "触发回车操作" 
                ;;
            2) 
                echo "触发数字1操作"
                ;;
            # 更多按键码参考/usr/include/linux/input-event-codes.h
        esac
    fi
done

按键码可查看/usr/include/linux/input-event-codes.h,比如KEY_UP为103,KEY_DOWN为108等。

3. 配置systemd服务稳定运行脚本

创建/etc/systemd/system/vfd-keyboard.service文件:

[Unit]
Description=VFD Display Keyboard Controller
After=multi-user.target

[Service]
Type=simple
User=root
ExecStart=/path/to/your/script.sh
Restart=always
RestartSec=2

[Install]
WantedBy=multi-user.target

执行以下命令启用并启动服务:

sudo systemctl daemon-reload
sudo systemctl enable vfd-keyboard.service
sudo systemctl start vfd-keyboard.service

4. 固定键盘设备路径(可选)

为避免重启后设备路径变化,创建udev规则:
新建/etc/udev/rules.d/99-vfd-keyboard.rules:

SUBSYSTEM=="input", ATTRS{idVendor}=="05af", ATTRS{idProduct}=="8277", SYMLINK+="input/vfd-keyboard"

重启后键盘会被固定映射到/dev/input/vfd-keyboard,脚本中可直接使用该路径。

替代方案:绑定到本地虚拟终端

如果偏好使用read命令,可将脚本绑定到本地tty1:

  1. 修改systemd服务的ExecStart:
ExecStart=/bin/bash -c "exec /path/to/your/script.sh < /dev/tty1 > /dev/tty1 2>&1"
  1. 配置tty1自动登录,创建/etc/systemd/system/getty@tty1.service.d/autologin.conf:
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin pi --noclear %I $TERM

重启后脚本会在本地tty1自动运行,键盘输入可直接被read命令捕获。

内容的提问来源于stack exchange,提问作者Martin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 12:05:16