admin
2026-08-18 18:29:36
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 更适合写成可维护的程序。如果你的脚本是部署在生产环境中,推荐把串口初始化、命令发送、响应解析和异常处理分开,这样更容易排查问题。