특정 문자열에 대한 직렬 포트를 모니터링하기 위해 bash 스크립트를 사용하려고 합니다. 이 문자열이 표시되면 일부 명령이 연결된 장치로 다시 전송되어야 합니다. 이것이 제가 연결된 라우터입니다. 이것이 제가 연결되어 있는 라우터이고 uboot 메뉴가 나타난 후 명령을 보내고 싶습니다.
ftdi-USB-UART 장치에서 직접 minicom을 사용하면(스크립트를 사용하지 않고) 모든 것이 잘 작동합니다. 이 맥락에서 "작동합니다"는 다음을 의미합니다.
- 부팅 메뉴 표시시간이 카운트다운되고 있어요, 숫자를 입력하거나 카운트다운이 끝날 때까지 장치는 입력을 기다리고 있습니다.
- 명령을 보내거나 숫자를 입력할 수 있습니다.
- 라우터는 선택한 옵션으로 "부팅"됩니다. (내 경우에는 시스템이 tftp-bootmode로 부팅되는데, 여기에서 서버 IP 등을 입력할 수 있습니다...)
이제 스크립트를 사용할 때. 라우터는 입력에 신경 쓰지 않으며 카운트다운이 실행되지 않습니다. 기본 옵션으로 직접 부팅됩니다. Raspberry Pi에서 minicom + /dev/ttyAMA0을 사용할 때와 동일한 동작입니다(ftdi 장치는 설명된 대로 작동함).
내 스크립트에 일부 매개변수가 누락된 것 같습니다. 아마도 stty에 대한 특별한 옵션을 선택해야 할까요?
아니면 라우터가 "누군가 나에게 몇 가지 명령을 보낼 수 있다"는 것을 인식할 수 있도록 시작 부분에 특수 "제어 문자"를 보내야 합니까?
검색 중인 문자열을 감지할 수 있지만 앞서 말했듯이 라우터는 전송된 명령을 인식하지 못합니다.
#!/bin/bash
tty=/dev/ttyUSB0
exec 4<$tty 5>$tty
stty -F $tty 115200 -echo
while [ "${output}" != "Please choose the operation:" ]; do #wait for bootmenu to appear
read output <&4
echo "$output"
done
printf "\t\n ***** gotcha! ***** \n\n" #bootmenu is showing
echo -e "\x31" >&5 # echo '1' for taking boot option 1
printf "\t\n ***** echo '1' ***** \n\n"
while true; do #just for debugging (was command received?)...
read output <&4
echo "$output"
done
#commands for setting Target-IP, TFTP-Server-IP-address should follow here...
미리 감사드립니다 :-)
답변1
echo -n "1" >&5
나를 위해 그랬어요. uboot가 래핑을 원하지 않는 것 같습니다. 그렇지 않으면 이상하게 동작할 것입니다.
당신의 도움을 주셔서 대단히 감사합니다!
여기에 "전체" 스크립트가 있습니다. 아마도 누군가에게 도움이 될 것입니다.
#!/bin/bash
tty=/dev/ttyUSB0
exec 4<$tty 5>$tty
stty -F $tty 115200 -brkint -icrnl -imaxbel iutf8 -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke
tftp_client_ip="10.10.30.111"
tftp_server_ip="10.10.30.1"
tftp_file="test.file"
while [ "$firstword" != "Please" ]; do # wait for bootmenu to apear
read -e output <&4
firstword=$(echo "$output" | cut -f1 -d" ")
echo "$output"
done
#printf "\t\n ***** ***** gotcha! ***** ***** \n\n"
sleep 0.5
# DONT SEND NEWLINEs - otherwise uboot doesn´t recognize commands !!!!!
echo -n "1" >&5 # echo '1' for taking boot option 1
printf "\t\n ***** ***** echo '1' ***** ***** \n\n"
# MUST TO WAIT FOR DELAY - try to fix that by "emulate" RETURN button?
sleep 5
#input TFTP-client IP
for((i=0;i<20;i++)); do
echo -ne "\b \b" >&5 #erase characters
sleep 0.05
done
printf "%s\r" "$tftp_client_ip" >&5
#input TFTP-server IP
for((i=0;i<20;i++)); do
echo -ne "\b \b" >&5 #erase characters
sleep 0.05
done
printf "%s\r" "$tftp_server_ip" >&5
#input TFTP-file
printf "%s\r" "$tftp_file" >&5
while true; do #just for debugging...
read -e output <&4
echo "$output"
done
# router should boot to RAM with "$tftp_file"