【问题标题】:Sending modem AT command and parsing result发送调制解调器 AT 命令并解析结果
【发布时间】:2015-04-24 16:27:16
【问题描述】:

我想使用 shell 脚本向我的调制解调器发送AT 命令并解析结果以验证是否返回了 OK。

at=`echo -ne "AT+CFUN1=1\r\n" > /dev/ttyUSB0 | cat /dev/ttyUSB0`

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

【问题讨论】:

  • 您不能从普通命令行向调制解调器发送 AT 命令。您需要使用socatminicom 之类的东西来与调制解调器建立串行连接。见:How to send AT commands to a modem in Linux?
  • 你也可以使用kermit
  • 我正在使用 minicom 建立与主板的串行连接。调制解调器启动后,我使用 microcom 或 socat 与它通话。但是,使用简单的回显可以通过此接口发送 AT 命令,不是吗?
  • 在和modem串口通信之前,应该使用stty或者setserial来设置SerialPort的波特率。

标签: linux bash shell at-command modem


【解决方案1】:

绝对可以向调制解调器发送 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

如果您打算以更复杂的方式解析输出,则应将输出保存到文件中,而不是提供文件名而不是最后一个 - 并阅读。

【讨论】:

  • 为了在我的 Raspberry Pi 上工作,我必须将源文件从使用 '\r\n' 切换到 '\n'。除此之外,这非常有效!
  • 可以用atinout发短信吗?我知道它可以用于执行不带参数的命令,但是当我们需要输入消息和终止字符来发送它时可以使用它吗?
【解决方案2】:

我无法通过@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 是否适用于所有情况,因为它会产生一些非打印字符并且可能会重复输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多