我有一台通过串行连接的计算机。我想在它作为 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 秒睡眠。
该解决方案允许我自动停止启动过程。