Linux调用串口的基础概念
在Linux系统中,串口通信是一种常见的硬件交互方式,广泛应用于嵌入式开发、工业控制、设备调试等场景,Linux将串口设备抽象为特殊的字符设备文件,通常位于/dev目录下,如/dev/ttyS0(COM1)、/dev/ttyUSB0(USB转串口)等,调用串口本质上是通过系统调用或库函数对这些设备文件进行读写操作,实现数据的收发,与Windows等系统不同,Linux提供了统一的文件接口和丰富的工具集,使得串口编程更加灵活和高效。

串口配置的核心参数
在调用串口之前,必须正确配置其通信参数,以确保数据传输的准确性,核心参数包括波特率、数据位、停止位、校验位和流控方式。
- 波特率(Baud Rate):定义数据传输的速率,常见值有9600、19200、115200等,Linux通过
termios结构体中的c_cflag字段设置,使用B9600、B115200等常量。 - 数据位(Data Bits):表示每帧数据的有效位数,通常为5~8位,默认为8位,通过
CS8(8位数据位)等常量配置。 - 停止位(Stop Bits):用于标识一帧数据的结束,可为1、1.5或2位,默认为1位,通过
CSTOPB(2位停止位)等常量控制。 - 校验位(Parity Bit):用于简单的错误检测,可选无校验(
PARENB)、奇校验(PARODD)或偶校验。 - 流控(Flow Control):防止数据溢出,包括硬件流控(RTS/CTS)和软件流控(XON/XOFF),通常禁用以简化配置。
还需设置原始输入模式(ICANON)以关闭回显和缓冲,确保数据实时处理。
串口打开与权限管理
Linux中,串口设备文件需通过open()函数打开,返回文件描述符(File Descriptor,FD)。
int fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
O_RDWR:以读写方式打开;O_NOCTTY:防止终端成为进程的控制终端;O_NDELAY:非阻塞模式(可选,默认阻塞)。
权限管理是关键,普通用户需拥有对设备文件的读写权限(通常为crw-rw-rw-),可通过chmod命令调整,或用户组管理(如将用户加入dialout组),若权限不足,open()将返回-1并设置errno为EACCES。

串口配置与数据收发
打开串口后,需通过termios结构体配置参数,流程如下:
- 获取当前配置:
struct termios options; tcgetattr(fd, &options);
- 修改参数:
cfsetispeed(&options, B115200); // 设置输入波特率 cfsetospeed(&options, B115200); // 设置输出波特率 options.c_cflag |= (CLOCAL | CREAD); // 忽略调制解调器控制线,启用接收 options.c_cflag &= ~PARENB; // 无校验位 options.c_cflag &= ~CSTOPB; // 1位停止位 options.c_cflag &= ~CSIZE; // 清除数据位设置 options.c_cflag |= CS8; // 8位数据位 options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // 原始输入模式,关闭回显 options.c_oflag &= ~OPOST; // 原始输出模式
- 应用配置:
tcsetattr(fd, TCSANOW, &options); // 立即生效
数据收发使用read()和write()函数,
char buf[1024];
int n = read(fd, buf, sizeof(buf)); // 读取数据
if (n > 0) {
write(fd, buf, n); // 回发数据(可选)
}
read()为阻塞调用,可设置超时(tcgetattr + c_cc[VMIN]和c_cc[VTIME])以避免无限等待。
串口状态监控与错误处理
通信过程中需监控串口状态,如数据是否就绪、错误是否发生。ioctl()函数可用于获取串口状态:

int status; ioctl(fd, TIOCMGET, &status); // 获取调制解调器状态(如CTS、DSR)
常见错误包括:
- 设备未找到:
open()返回-1,errno为ENOENT,检查设备路径是否正确; - 数据溢出:
read()返回-1,errno为EAGAIN(非阻塞模式)或EIO(硬件错误); - 校验错误:通过
c_iflag中的INPCK启用校验位检测,并读取c_cc中的错误计数。
tcflush(fd, TCIOFLUSH)可清空输入/输出缓冲区,避免残留数据干扰。
关键注意事项
- 资源释放:通信结束后需关闭串口(
close(fd)),避免资源泄露。 - 多进程访问:串口设备不支持多进程同时写入,需通过文件锁(
flock)或信号量同步。 - USB转串口设备:需确认内核是否加载
ftdi_sio或cp210x驱动,可通过lsusb或dmesg查看。 - 调试工具:使用
minicom、screen或picocom等工具快速测试串口通信,minicom -D /dev/ttyUSB0 -b 115200
通过以上步骤,即可在Linux系统中实现稳定、高效的串口调用,掌握termios配置和文件I/O操作是核心,而权限管理和错误处理则确保了通信的可靠性。


















