服务器测评网
我们一直在努力

Linux shell串口通信如何配置与调试?

Linux Shell 串口通信是嵌入式开发、设备调试及自动化运维中常见的技术手段,通过 Shell 脚本结合系统工具,可实现与串口设备的双向数据交互,完成数据采集、参数配置、状态监控等任务,本文将从串口基础配置、数据收发实现、高级应用技巧及常见问题解决四个方面,系统介绍 Linux 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 -gcat /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),并使用 catdd 命令实时读取。

Linux shell串口通信如何配置与调试?

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 创建命名管道,结合 teecat 实现后台数据监听。

mkfifo /tmp/pipe_rx
cat /dev/ttyUSB0 > /tmp/pipe_rx &  # 后台接收数据
tee /tmp/pipe_rx | while read line; do
    echo "Received: $line"          # 处理接收数据
done &

通过 kill %1kill %2 可终止后台进程。

数据日志记录

使用 tee 命令可将串口数据同时输出到终端和日志文件,便于后续分析:

Linux shell串口通信如何配置与调试?

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

常见问题与解决方案

  1. 权限问题

    • 现象:提示 Permission denied
    • 解决:检查用户是否在 dialout 组,或使用 sudo 权限操作。
  2. 数据乱码或丢失

    • 原因:波特率、数据位等参数不匹配,或流控未关闭
    • 解决:重新确认串口配置,确保双方参数一致,关闭硬件流控(-crtscts)。
  3. 数据接收延迟

    • 原因:终端缓冲区未及时刷新
    • 解决:使用 stty 配置 min 0 time 0,或手动发送 Ctrl+C 刷新缓冲区。
  4. 设备未识别

    • 原因:驱动未加载或 USB 设备未连接
    • 解决:检查 ls /dev/ttyUSB* 是否存在设备,使用 dmesg | grep tty 查看内核日志。

通过合理配置工具与脚本逻辑,Linux Shell 串口通信可灵活应用于各类设备交互场景,有效提升开发与运维效率,实际应用中需结合具体设备协议调整数据格式,并通过日志与调试工具优化通信稳定性。

赞(0)
未经允许不得转载:好主机测评网 » Linux shell串口通信如何配置与调试?