在Linux系统中,串口通信是一种常见的外设交互方式,广泛应用于嵌入式开发、设备调试、数据采集等领域,通过Shell脚本结合串口工具,可以高效实现自动化串口操作,本文将详细介绍Linux串口通信的基础知识、Shell实现方法及实用技巧。

Linux串口基础
Linux将串口设备抽象为字符设备文件,通常位于/dev目录下,常见的设备名包括/dev/ttyS0(COM1)、/ttyS1(COM2)以及USB转串口设备(如/dev/ttyUSB0),串口通信涉及波特率、数据位、停止位、校验位等关键参数,需确保通信双方配置一致,以下是串口核心参数说明:
| 参数类型 | 可选值 | 说明 |
|---|---|---|
| 波特率 | 9600, 19200, 38400, 115200等 | 数据传输速率 |
| 数据位 | 5, 6, 7, 8 | 每帧数据包含的位数 |
| 停止位 | 1, 2 | 帧结束时的停止位数 |
| 校验位 | None, Even, Odd, Space, Mark | 数据错误校验方式 |
| 流控 | None, XON/XOFF, RTS/CTS | 数据流控制机制 |
串口配置工具
Linux提供了多种串口配置工具,其中stty命令是最基础的命令行工具,可用于查看和修改串口参数,配置/dev/ttyUSB0为115200波特率、8数据位、无校验、1停止位:
stty -F /dev/ttyUSB0 115200 cs8 -cstopb -parenb
minicom和screen是交互式串口终端工具,适合直接与设备通信,使用screen连接串口的命令为:
screen /dev/ttyUSB0 115200
退出时需按Ctrl+A,再按K终止会话。
Shell脚本实现串口通信
通过Shell脚本可以自动化串口数据收发操作,核心思路是使用cat或dd命令读取串口数据,通过echo或printf向串口写入数据,以下是一个基础串口通信脚本示例:
#!/bin/bash
SERIAL_PORT="/dev/ttyUSB0"
BAUD_RATE="115200"
# 配置串口参数
stty -F $SERIAL_PORT $BAUD_RATE cs8 -cstopb -parenb
# 向串口发送数据
echo "AT+CMD" > $SERIAL_PORT
# 读取串口响应(设置超时时间为5秒)
timeout 5 cat $SERIAL_PORT > response.txt
# 输出响应内容
if [ -s response.txt ]; then
echo "设备响应:"
cat response.txt
else
echo "未收到设备响应或超时"
fi
高级串口操作技巧
非阻塞读取
默认情况下,串口读取是阻塞式的,可以使用stty设置非阻塞模式:

stty -F $SERIAL_PORT -icanon min 0 time 0
min 0表示无字符立即返回,time 0表示无超时。
多线程收发
通过&实现后台读取,同时在前台发送数据:
cat $SERIAL_PORT > response.log & cat > $SERIAL_PORT
按Ctrl+C终止后台进程。
串口状态监控
使用setserial命令查看串口详细信息:
setserial -g /dev/ttyUSB0
输出包括UART类型、端口地址等硬件信息。
错误处理与调试
串口通信中常见的错误包括设备无响应、数据错乱等,可通过以下方法排查:

- 检查设备权限:确保当前用户对串口设备有读写权限,可通过
chmod调整或加入dialout用户组。 - 验证物理连接:检查串口线、转接头是否接触良好。
- 日志分析:使用
strace跟踪系统调用:strace -e trace=write,read cat /dev/ttyUSB0
- 逻辑分析仪:对于复杂通信场景,使用逻辑分析仪捕获波形分析时序问题。
实际应用案例
智能电表数据采集
通过串口读取智能电表的实时数据,脚本需实现:
- 发送读取指令(如
0x01 0x03 0x00 0x00 0x00 0x01 0x84 0x0A) - 解析返回的16进制数据
- 计算校验和并提取有效值
路由器配置备份
通过串口登录路由器CLI,自动化执行配置备份:
#!/bin/bash expect -c " spawn screen /dev/ttyUSB0 9600 expect \"login:\" send \"admin\r\" expect \"password:\" send \"password\r\" expect \"#\" send \"show running-config > backup.cfg\r\" expect \"#\" send \"exit\r\" interact
安全注意事项
- 避免缓冲区溢出:对输入数据进行长度校验,防止恶意构造的数据导致程序异常。
- 敏感信息保护:不要在脚本中硬编码密码,建议使用环境变量或加密配置文件。
- 资源释放:确保脚本退出前关闭串口设备,避免资源占用:
exec {fd}< $SERIAL_PORT exec {fd}>&-
通过合理运用Linux串口工具和Shell脚本,可以高效实现设备自动化交互,掌握串口参数配置、数据收发控制及错误处理方法,是嵌入式开发和系统运维的重要技能,在实际应用中,需根据具体设备协议调整通信逻辑,并结合日志分析和工具调试确保通信可靠性。
















