프롬프트가 표시될 때 직렬을 통한 부팅을 어떻게 중지합니까?

프롬프트가 표시될 때 직렬을 통한 부팅을 어떻게 중지합니까?

직렬로 연결된 컴퓨터가 있습니다. 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초 절전 모드를 수행하도록 검사를 변경했습니다.

이 솔루션을 사용하면 시작 프로세스를 자동으로 중지할 수 있습니다.

관련 정보