Linux Shell 串口通信是嵌入式开发、设备调试及自动化运维中常见的技术手段,通过 Shell 脚本结合系统工具,可实现与串口设备的双向数据交互,完成数据采集、参数配置、状态监控等任务,本文将从串口基础配置、数据收发实现、高级应用技巧及常见问题解决四个方面,系统介绍 Linux Shell 串口操作的核心要点。

串口基础配置与工具准备
在 Linux 系统中,串口设备通常表示为 /dev/ttyS*(内置串口)或 /dev/ttyUSB*(USB 转串口设备),进行串口通信前,需通过 stty 命令配置串口参数,确保收发双方波特率、数据位、停止位、校验位等关键属性一致。
核心配置参数说明
| 参数 | 可选值 | 说明 |
|————|————————-|————————–|
| 波特率 | 9600, 19200, 115200 等 | 数据传输速率 |
| 数据位 | 5, 6, 7, 8 | 通常为 8 位 |
| 停止位 | 1, 2 | 通常为 1 位 |
| 校验位 | none, even, odd, mark | 无校验、偶校验、奇校验 |
| 流控 | hard, soft, – | 硬件流控、软件流控、无流控 |
以配置 /dev/ttyUSB0(波特率 115200、8 数据位、无校验、1 停止位、无流控)为例,执行命令:
stty -F /dev/ttyUSB0 115200 cs8 -cstopb -parenb -crtscts
若需查看当前串口配置,可使用 stty -g 或 cat /proc/tty/driver/serial,需确保用户对串口设备具有读写权限,可通过 sudo usermod -aG dialout $USER 将用户加入 dialout 组,或使用 chmod 666 /dev/ttyUSB0 调整权限。
串口数据收发实现
数据发送
Shell 中可通过 echo 命令结合重定向向串口发送数据,但需注意 -e 参数处理转义字符(如 \r、\n),例如向串口发送 AT 指令:
echo -e "AT\r\n" > /dev/ttyUSB0
若需发送二进制数据,可使用 printf 命令并指定十六进制转义序列,或通过 xxd 工具将十六进制数据转换为二进制后发送:
printf "\x01\x02\x03\x04" > /dev/ttyUSB0 # 发送十六进制数据 01 02 03 04
数据接收
接收串口数据时,需避免 Shell 缓冲导致的数据延迟,可通过 stty 配置关闭终端回显(-echo)和规范模式(-icanon),并使用 cat 或 dd 命令实时读取。

stty -F /dev/ttyUSB0 -echo -icanon min 0 time 0 # 配置非阻塞模式 cat /dev/ttyUSB0 # 实时读取串口数据
若需接收指定长度数据,可使用 dd 命令:
dd if=/dev/ttyUSB0 bs=1 count=10 # 读取 10 字节数据
对于需要超时控制的场景,可通过 timeout 命令实现,5 秒超时读取:
timeout 5 cat /dev/ttyUSB0
高级应用技巧
脚本化串口交互
通过 expect 工具可实现自动化串口交互,模拟终端输入输出,例如自动登录串口设备并执行命令:
#!/usr/bin/expect -f spawn cu -l /dev/ttyUSB0 -s 115200 expect "login:" send "admin\r" expect "Password:" send "123456\r" expect "$ " send "show version\r" expect eof
需提前安装 expect 包(sudo apt install expect),并赋予脚本执行权限(chmod +x script.exp)。
多线程数据收发
若需同时处理串口发送与接收,可使用 mkfifo 创建命名管道,结合 tee 和 cat 实现后台数据监听。
mkfifo /tmp/pipe_rx
cat /dev/ttyUSB0 > /tmp/pipe_rx & # 后台接收数据
tee /tmp/pipe_rx | while read line; do
echo "Received: $line" # 处理接收数据
done &
通过 kill %1、kill %2 可终止后台进程。
数据日志记录
使用 tee 命令可将串口数据同时输出到终端和日志文件,便于后续分析:

cat /dev/ttyUSB0 | tee -a serial.log
若需按时间戳记录,可结合 date 命令:
while read line; do
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $line" >> serial.log
done < /dev/ttyUSB0
常见问题与解决方案
-
权限问题
- 现象:提示
Permission denied - 解决:检查用户是否在
dialout组,或使用sudo权限操作。
- 现象:提示
-
数据乱码或丢失
- 原因:波特率、数据位等参数不匹配,或流控未关闭
- 解决:重新确认串口配置,确保双方参数一致,关闭硬件流控(
-crtscts)。
-
数据接收延迟
- 原因:终端缓冲区未及时刷新
- 解决:使用
stty配置min 0 time 0,或手动发送Ctrl+C刷新缓冲区。
-
设备未识别
- 原因:驱动未加载或 USB 设备未连接
- 解决:检查
ls /dev/ttyUSB*是否存在设备,使用dmesg | grep tty查看内核日志。
通过合理配置工具与脚本逻辑,Linux Shell 串口通信可灵活应用于各类设备交互场景,有效提升开发与运维效率,实际应用中需结合具体设备协议调整数据格式,并通过日志与调试工具优化通信稳定性。



















