我尝试使用 bash 脚本来监视串行端口中的特定字符串。如果显示此字符串,则应将一些命令发送回连接的设备。这是我连接的路由器。这是我连接到的路由器,我想在 uboot 菜单出现后发送命令。
当直接将 minicom 与 ftdi-USB-UART 设备一起使用时(不使用脚本),一切正常。在这种情况下,“它有效”意味着:
- 显示启动菜单时间正在倒计时,设备正在等待输入,直到我输入数字或倒计时结束。
- 我能够发送命令/输入数字。
- 路由器“启动”到所选选项。 (就我而言 - 系统启动 tftp-bootmode,我可以在其中输入服务器 IP 等内容......)
现在,当我使用脚本时。路由器不关心输入,倒计时也不运行。它只是直接启动到默认选项。在树莓派上使用 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"