Linux 串口传输
串口通信基础
串口通信是一种异步串行通信方式,通过数据线、地线等信号线实现设备间的数据交换,Linux 系统中,串口设备通常以 /dev/ttyS*(传统串口)或 /dev/ttyUSB*(USB转串口)的形式存在,串口通信的核心参数包括波特率、数据位、停止位、校验位和流控,这些参数需在通信两端保持一致,否则会导致数据传输错误。

- 波特率:决定数据传输速率,常见值如 9600、115200 等。
- 数据位:通常为 8 位,表示每帧数据的有效位数。
- 停止位:通常为 1 位或 2 位,标志一帧数据的结束。
- 校验位:用于错误检测,可选奇校验、偶校验或无校验。
- 流控:硬件流控(RTS/CTS)或软件流控(XON/XOFF),防止数据溢出。
Linux 串口配置与管理
在 Linux 中,串口设备通过文件形式访问,用户可通过命令行工具或编程接口进行配置。
查看串口设备
使用 ls /dev/ttyS* 或 ls /dev/ttyUSB* 命令列出系统中的串口设备,通过 dmesg | grep tty 可查看串口设备的加载信息。
配置串口参数
stty 命令是 Linux 下配置串口参数的常用工具,设置 /dev/ttyUSB0 的波特率为 115200、8 位数据位、无校验、1 位停止位:
stty -F /dev/ttyUSB0 115200 cs8 -cstopb -parenb
若需查看当前串口配置,可执行:
stty -F /dev/ttyUSB0
串口权限管理
默认情况下,普通用户可能无法访问串口设备,可通过修改 /etc/udev/rules.d/ 下的规则文件或使用 usermod 将用户加入 dialout 组(通常拥有串口设备访问权限)来解决权限问题。
sudo usermod -aG dialout $USER
串口数据传输工具
Linux 提供多种工具用于串口数据的收发,满足不同场景需求。
minicom
minicom 是一款功能强大的终端仿真工具,支持串口通信、文件传输等,安装后可通过以下命令启动:
sudo minicom -b 115200 -D /dev/ttyUSB0
参数 -b 指定波特率,-D 指定串口设备,在 minicom 界面中,可通过 Ctrl+A 进入菜单,配置参数或退出程序。

screen
screen 是轻量级的终端复用工具,也可用于串口通信。
screen /dev/ttyUSB0 115200
退出时需先按 Ctrl+A,再按 K 终会话。
cat 与 echo
简单的数据收发可通过 cat 和 echo 实现,持续接收串口数据:
cat /dev/ttyUSB0
向串口发送数据:
echo "Hello" > /dev/ttyUSB0
但需注意,cat 会持续读取数据,需手动终止;echo 发送数据后不会等待响应。
编程实现串口通信
对于复杂应用,可通过编程语言(如 C、Python)实现串口通信。
C 语言实现
Linux 提供了 termios 库用于串口配置,以下是一个简单的发送与接收示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
int main() {
int fd = open("/dev/ttyUSB0", O_RDWR);
if (fd < 0) {
perror("Failed to open serial port");
return 1;
}
struct termios options;
tcgetattr(fd, &options);
cfsetispeed(&options, B115200);
cfsetospeed(&options, B115200);
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
tcsetattr(fd, TCSANOW, &options);
char *msg = "Hello from C";
write(fd, msg, strlen(msg));
char buf[256];
int n = read(fd, buf, sizeof(buf));
if (n > 0) {
buf[n] = '\0';
printf("Received: %s\n", buf);
}
close(fd);
return 0;
}
Python 实现
Python 的 pyserial 库简化了串口操作,安装库后,可通过以下代码实现通信:

import serial
ser = serial.Serial('/dev/ttyUSB0', 115200, timeout=1)
ser.write(b"Hello from Python")
response = ser.read(10)
print("Received:", response.decode())
ser.close()
串口调试与常见问题
在实际应用中,串口通信可能遇到数据丢失、乱码等问题,需通过调试工具和方法排查。
使用 strace 跟踪系统调用
strace -e trace=write,read cat /dev/ttyUSB0
可观察串口数据的读写操作,定位底层问题。
示波器或逻辑分析仪
硬件层面可通过示波器检查信号波形,验证波特率、数据位等参数是否正确。
常见问题解决
- 数据乱码:检查波特率、数据位等参数是否匹配。
- 无数据接收:确认串口设备是否正确识别、权限是否开放、接线是否牢固。
- 数据丢失:启用流控或降低波特率,避免数据溢出。
高级应用与扩展
Linux 串口通信不仅限于简单的数据收发,还可结合其他技术实现复杂功能,通过 socat 工具将串口数据重定向到网络,实现远程串口通信;或结合 Shell 脚本实现自动化数据采集与处理。
在嵌入式开发中,Linux 设备常通过串口与传感器、模块交互,实现数据采集或控制指令下发,串口也可作为调试接口,在系统启动时输出日志信息,帮助开发者排查问题。
Linux 串口传输是一种灵活且可靠的通信方式,广泛应用于嵌入式系统、工业控制、设备调试等领域,通过掌握串口配置、工具使用及编程实现,开发者可以高效解决设备间的数据交换需求,在实际应用中,需注意参数匹配、权限管理及异常处理,确保通信稳定可靠,随着物联网和嵌入式技术的发展,Linux 串口通信仍将扮演重要角色,为各类应用提供基础支持。




















