发送调制解调器AT命令并解析结果

7
我想通过使用shell脚本发送AT命令到我的调制解调器,并解析结果以验证是否返回了OK。
at=`echo -ne "AT+CFUN1=1\r\n" > /dev/ttyUSB0 | cat /dev/ttyUSB0`

什么是解析at1变量并提取“OK”或“ERROR”的最佳方法?

4
无法在正常的命令行中向调制解调器发送AT指令。您需要使用类似socatminicom的工具,建立与调制解调器的串行连接。参见:如何在Linux中向调制解调器发送AT指令? - David C. Rankin
你也可以使用 kermit - Elliott Frisch
1
我正在使用minicom建立与板子的串行连接。一旦调制解调器启动,我就使用microcom或socat与其通信。然而,通过使用简单的echo命令,可以通过此接口发送AT命令,是吗? - ogs
1
在与调制解调器串口通信之前,您应该使用 stty 或 setserial 来设置 SerialPort 的波特率。 - TonyHo
2个回答

8

完全可以像您尝试的那样通过命令行发送AT指令并捕获调制解调器的输出,但是不能仅使用纯bash shell脚本。这就是为什么我编写了atinout程序,专门支持您所问的场景。

测试如下:

MODEM_DEVICE=/dev/ttyUSB0

MODEM_OUTPUT=`echo AT | atinout - $MODEM_DEVICE -`
case $MODEM_OUTPUT
in
        *OK*)
                echo "Hurray, modem is up and running :)"
                ;;
        *)
                echo "Oh no! Something is not working :("
                ;;
esac

如果您想以更为复杂的方式解析输出,则应将输出保存到文件中,而不是仅使用最后一个-。可通过指定文件名来实现保存输出并随后读取。

为了让我的树莓派正常工作,我不得不将源文件中的'\r\n'替换为'\n'。除此之外,一切都非常顺利! - ctag
能否使用atinout发送短信?例如,我知道它可以用于执行无需参数的命令,但是当我们需要输入消息和终止字符以发送短信时,它是否可用? - Miloš Mladenović

0

我无法使用@hlovdal的解决方案与我的华为E3372h-158进行通信,因此我自己编写了一个解决方案,使用expectscreen,在这种情况下用于通过^CHIPTEMP?读取温度传感器:

output=$(sudo expect <<EOF
set timeout 5
log_user 0                                                                                                                 spawn sudo screen /dev/ttyUSB0-
sleep 1
send "AT\x5ECHIPTEMP?\r"
expect "OK"
puts "\n-->\$expect_out(buffer)<--"
# Send C-a \ to end the session
send "\x01"
send "\x5C"
EOF
)
# Strip non-printable control characters
output=$(printf "$output" | tr -dc '[:print:]\n' )
printf "$output\n" | grep -P "^\^CHIPTEMP"

提示和注意事项:设置log_user 1以获取screen的输出。不确定screen在所有情况下是否有效,因为它会产生一些非打印字符和重复输出。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接