Welcome
admin
admin

2026-08-18 18:29:36

世界杯误判
8353 270

Q在 Linux 脚本里,如何把 AT 命令发送到串口设备?我需要在 Shell 脚本中向 4G 模块、GPS 模块或其他串口设备发送 AT 指令,应该怎么打开串口并把命令写进去?

A用 echo、printf 或 cat 配合串口设备文件发送

在 Linux 中,AT 命令通常通过串口设备文件发送,比如 /dev/ttyUSB0、/dev/ttyS1 或 /dev/ttyACM0。脚本里可以用 echo 或 printf 把命令写入设备文件,也可以借助 stty 先设置串口参数。示例:

stty -F /dev/ttyUSB0 115200 cs8 -cstopb -parenb

printf 'AT\r' > /dev/ttyUSB0

如果需要读取返回值,可以再从同一个设备文件中读取响应,或使用更适合交互式通信的工具,比如 minicom、screen、expect、socat。在实际使用中,串口波特率、校验位、回车换行符格式都要和设备要求一致。

Q脚本发送 AT 指令后,为什么设备没有返回结果?我已经把命令写到串口里了,但模块没有响应,或者响应内容看不见,这种情况通常是什么原因?

A多半是串口参数、换行符或权限配置不对

设备没有响应时,常见原因包括串口配置错误、命令结尾格式不对、设备被别的程序占用,或当前用户没有读写权限。AT 命令通常需要以回车结尾,也就是 \r,有些设备还要求 \r\n。可以检查:

ls -l /dev/ttyUSB0

stty -F /dev/ttyUSB0

如果权限不足,可以把用户加入 dialout 组,或者临时使用 sudo。如果串口正被别的进程占用,也会导致无法通信。还要确认波特率、数据位、停止位、校验位是否正确,因为参数不匹配时,命令即使发出去了,设备也可能无法识别。

QLinux 脚本里怎样连续发送多条 AT 命令并判断执行结果?我希望在自动化脚本中依次发送多条 AT 指令,并根据返回的 OK、ERROR 或具体内容决定后续流程,应该怎么做?

A可用循环读取响应,再按返回值做分支判断

可以把多条 AT 命令写成脚本顺序执行,每发送一条就读取设备返回内容,并根据响应结果判断是否继续。常见方式是使用 timeout 配合 cat、read 或 expect。例如:

#!/bin/bash

DEV=/dev/ttyUSB0

stty -F $DEV 115200 cs8 -cstopb -parenb

send_at() {

local cmd="$1"

printf '%s\r' "$cmd" > "$DEV"

timeout 2 cat "$DEV"

}

resp=$(send_at "AT")

echo "$resp"

resp=$(send_at "ATI")

echo "$resp"

如果脚本需要更稳定的交互控制,expect 通常比纯 shell 更适合,因为它可以等待特定字符串,比如 OK、ERROR,再决定是否继续执行。对于需要批量配置模块参数的场景,这种方式很实用。

Q有没有更适合自动化场景的方式来管理 AT 命令通信?我不想手动处理串口读写和响应匹配,希望在 Linux 下用脚本更稳定地控制 AT 通信,有没有更推荐的方案?

A可以考虑 expect、Python pyserial 或 socat

如果只是简单发送一两条命令,Shell 脚本已经够用;如果需要处理超时、返回解析、错误重试、并发控制,建议使用 expect 或 Python 的 pyserial。pyserial 能更方便地设置串口参数、读取多行响应和处理超时逻辑。示例思路如下:

import serial

ser = serial.Serial('/dev/ttyUSB0', 115200, timeout=2)

ser.write(b'AT\r')

print(ser.read(100).decode(errors='ignore'))

ser.close()

expect 适合做命令交互自动化,pyserial 更适合写成可维护的程序。如果你的脚本是部署在生产环境中,推荐把串口初始化、命令发送、响应解析和异常处理分开,这样更容易排查问题。