直列に接続されたコンピュータがあります。 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秒のスリープモードを実行するようにチェックを変更しました。
このソリューションを使用すると、起動プロセスを自動的に停止できます。