プロンプトが表示されたら、シリアルを介した起動をどのように停止しますか?

プロンプトが表示されたら、シリアルを介した起動をどのように停止しますか?

直列に接続されたコンピュータがあります。 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

質問を投稿しようとしていた瞬間に気づきました。

最初のループで使用される「読み取り」コマンドは、コンソールに改行文字が表示された後にのみその行を表示します。これは、新しい行が表示されるまで、スクリプトがプロンプトに応答できないことを意味します。これはウィンドウ期間が切れたことを意味します。

この問題を解決するために、実際のプロンプトの上に表示される行を見つけて、書き込みを実行する前に1/100秒のスリープモードを実行するようにチェックを変更しました。

このソリューションを使用すると、起動プロセスを自動的に停止できます。

おすすめ記事