我希望能够每 5 秒向 /dev/ttyUSB1 发送一次命令“AT+CSQ”,并将响应记录到文本文件中。我可以通过屏幕手动执行此操作(屏幕 /dev/ttyUSB1 并输入 AT+CSQ 并查看响应),但我如何将其作为 bash 脚本执行?
答案1
下面是一个示例脚本,其中包含一些用于在脚本终止(命令trap
)时进行记录和清理的逻辑。重要的技巧是保持串行端口的输入打开,否则端口关闭时的输入可能会丢失。
#!/bin/bash
LOGFILE=/var/tmp/modemlog
MODEM=/dev/ttyUSB1
MODEMCMD=AT+CSQ
INTERVAL=5
LOGDATE="date +%Y%m%dT%H%M%S"
# write command to modem
wrmodem () {
echo -ne "$*"'\r\n' >"$MODEM"
log "--- sent: $*"
}
# log message to a logfile
log () {
echo "$($LOGDATE) $@" >>"$LOGFILE"
}
# logger
{
trap 'log "=== logger stopped $BASHPID"' EXIT
log "=== logger started: $BASHPID"
while true ; do
if read ; then
log "$(tr -d \\r <<<"$REPLY")"
fi
done
} <"$MODEM" &
LOGGERPID=$!
trap 'kill $LOGGERPID' EXIT
# requester
while true ; do
wrmodem "$MODEMCMD"
sleep $INTERVAL
done
答案2
该expect
工具就是为此类任务而设计的。man expect
将帮助您入门。