Bash 脚本 - 观察串行端口的特定字符串,然后发回命令

Bash 脚本 - 观察串行端口的特定字符串,然后发回命令

我尝试使用 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"

相关内容