当显示提示时如何停止通过串行启动?

当显示提示时如何停止通过串行启动?

我有一台通过串行连接的计算机。我想在它作为 bash 脚本的一部分启动时停止它。计算机会发出一个提示以及一个短时间窗口,以按下一个键来停止启动过程并转到 uboot 命令行。

我当前的解决方案是从串行设备读取行并在显示提示时停止读取。然后我像这样向设备回显单个字符。

prompt="any key to stop autoboot"
prompted=false
fline=""
while [ "$prompted" == "false" ] && read fline
do
    echo $fline
    if [[ "$fline" =~ "$prompt" ]]
    then
        prompted=true
    fi
done < /dev/ttyUSB0

echo a > /dev/ttyUSB0

但是当我使用 minicom 重新串行时,我看不到提示或发出命令,并且计算机仍然启动。我知道循环在显示提示时也结束,因为提示是显示的最后一行。如果我从 minicom 终端启动整个过程并手动响应提示,那么启动就会停止,我可以看到提示并发出命令。

我通过以下代码找到了解决方法,但这不是一个非常精确的解决方案。

# start computer, then do
for i in `seq 1 1000`
do
    echo hi > /dev/ttyUSB0
    usleep 10000
done

但完成后我可以使用 minicom 查看 uboot 提示符并发出命令。我还可以通过将字节回显到串行设备来发出命令,它们的结果会出现在我的 minicom 会话中。因此,这种方法证明我可以通过将字节回显到串行设备来停止启动。

那么当出现提示时如何停止启动呢?

答案1

正当我要发布问题时,我想通了。

我在第一个循环中使用的“read”命令只会在控制台上出现换行符后显示该行。这意味着我的脚本在新行出现之前无法响应提示;这意味着窗口期已经结束了。

为了解决这个问题,我更改了检查以查找实际提示上方出现的行,然后在发出写入之前进行 1/100 秒睡眠。

该解决方案允许我自动停止启动过程。

相关内容