Linux串口类的基础概念与应用
串口通信作为一种经典的异步数据传输方式,在嵌入式系统、工业控制、设备调试等领域仍被广泛使用,Linux操作系统提供了完善的串口操作支持,通过文件接口和标准系统调用,开发者可以轻松实现串口数据的收发,本文将详细介绍Linux串口类的核心概念、编程方法及实际应用场景。

串口设备与文件接口
在Linux中,串口设备被抽象为特殊文件,通常位于/dev目录下,如/dev/ttyS0(COM1)、/dev/ttyUSB0(USB转串口)等,这些设备文件提供了与硬件串口交互的统一接口,应用程序通过标准文件操作函数(open()、read()、write()、close())即可完成串口通信,打开串口的代码片段如下:
int fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
if (fd < 0) {
perror("Failed to open serial port");
return -1;
}
需要注意的是,打开串口时需指定正确的标志位,如O_NOCTTY防止终端成为控制终端,O_NDELAY以非阻塞模式打开。
串口参数配置
串口通信的核心在于参数配置,Linux通过termios结构体实现串口属性的设置,关键参数包括波特率、数据位、停止位、校验位和流控等,以下为配置步骤示例:
-
获取当前配置:
struct termios options; tcgetattr(fd, &options);
-
设置波特率:

cfsetispeed(&options, B115200); cfsetospeed(&options, B115200);
-
配置数据帧格式:
options.c_cflag &= ~CSIZE; options.c_cflag |= CS8; // 8位数据位 options.c_cflag &= ~PARENB; // 无校验位 options.c_cflag &= ~CSTOPB; // 1位停止位
-
启用接收并设置超时:
options.c_cflag |= (CLOCAL | CREAD); options.c_cc[VMIN] = 1; // 最少接收1个字符 options.c_cc[VTIME] = 0; // 无超时
-
应用配置:
tcsetattr(fd, TCSANOW, &options);
数据收发与错误处理
串口数据读写通过read()和write()函数实现,但需注意异步通信的特性,读取数据时可能需要循环等待,或使用select()/poll()实现非阻塞检测:
fd_set read_fds;
FD_ZERO(&read_fds);
FD_SET(fd, &read_fds);
struct timeval timeout;
timeout.tv_sec = 1;
timeout.tv_usec = 0;
int ret = select(fd + 1, &read_fds, NULL, NULL, &timeout);
if (ret > 0) {
int n = read(fd, buffer, sizeof(buffer));
if (n < 0) {
perror("Read error");
}
}
发送数据相对简单,但需考虑缓冲区满的情况:

const char *data = "Hello, Serial Port!";
int n = write(fd, data, strlen(data));
if (n < 0) {
perror("Write error");
}
高级功能与多线程应用
Linux串口支持高级功能,如硬件流控(RTS/CTS)、软件流控(XON/XOFF)及非阻塞模式,在复杂应用中,可采用多线程设计:一个线程负责数据接收,另一个线程处理业务逻辑。
void *read_thread(void *arg) {
int fd = *(int *)arg;
char buffer[256];
while (1) {
int n = read(fd, buffer, sizeof(buffer));
if (n > 0) {
buffer[n] = '\0';
printf("Received: %s\n", buffer);
}
}
return NULL;
}
int main() {
int fd = open("/dev/ttyS0", O_RDWR);
pthread_t tid;
pthread_create(&tid, NULL, read_thread, &fd);
pthread_join(tid, NULL);
close(fd);
return 0;
}
实际应用场景
Linux串口类在多个领域具有重要应用:
- 嵌入式开发:作为调试接口,输出日志或与传感器通信。
- 工业控制:连接PLC、变频器等设备,实现协议转换(如Modbus)。
- 物联网:通过串口模块(如ESP8266)实现无线数据传输。
- 医疗设备:串口连接监护仪,采集生理信号数据。
Linux串口类通过标准文件接口和termios机制,为开发者提供了灵活、高效的串口通信解决方案,掌握其配置方法、数据收发技巧及多线程应用,能够满足不同场景下的设备交互需求,在实际开发中,还需注意错误处理、资源释放及跨平台兼容性,以构建稳定可靠的串口通信系统。



















