Ubuntu 下 C 语言串口通信开发指南
在嵌入式调试或硬件交互场景中,Linux 平台的串口通信是基础且关键的能力。本文基于 Ubuntu 环境,使用标准 C 库实现串口打开、参数配置及数据收发,重点讲解 termios 结构体与 select 非阻塞 IO 的配合使用。
核心头文件依赖
编写串口程序前,需要引入以下系统头文件以支持文件操作、终端设置及信号量控制:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>
#include <sys/select.h>
串口初始化与配置
打开设备文件后,必须通过 tcgetattr 获取当前属性并修改 termios 结构体。这里主要涉及波特率、数据位、校验位和停止位的设置。注意关闭输入处理标志(如 ICRNL),确保原始数据透传。
int setOpt(int fd, int nSpeed, int nBits, char nEvent, int nStop) {
struct termios newtio, oldtio;
if (tcgetattr(fd, &oldtio) != 0) {
perror("SetupSerial 1");
return -1;
}
bzero(&newtio, sizeof(newtio));
newtio.c_cflag |= CLOCAL | CREAD;
newtio.c_cflag &= ~CSIZE;
(nBits) {
: newtio.c_cflag |= CS7; ;
: newtio.c_cflag |= CS8; ;
}
(nEvent) {
:
newtio.c_cflag |= PARENB;
newtio.c_cflag |= PARODD;
newtio.c_iflag |= (INPCK | ISTRIP);
;
:
newtio.c_iflag |= (INPCK | ISTRIP);
newtio.c_cflag |= PARENB;
newtio.c_cflag &= ~PARODD;
;
:
newtio.c_cflag &= ~PARENB;
;
}
(nSpeed) {
: cfsetispeed(&newtio, B2400); cfsetospeed(&newtio, B2400); ;
: cfsetispeed(&newtio, B4800); cfsetospeed(&newtio, B4800); ;
: cfsetispeed(&newtio, B9600); cfsetospeed(&newtio, B9600); ;
: cfsetispeed(&newtio, B115200); cfsetospeed(&newtio, B115200); ;
: cfsetispeed(&newtio, B9600); cfsetospeed(&newtio, B9600); ;
}
(nStop == ) newtio.c_cflag &= ~CSTOPB;
(nStop == ) newtio.c_cflag |= CSTOPB;
newtio.c_cc[VTIME] = ;
newtio.c_cc[VMIN] = ;
tcflush(fd, TCIFLUSH);
((tcsetattr(fd, TCSANOW, &newtio)) != ) {
perror();
;
}
;
}

