TECH DIARY
嵌入式Linux串口应用编程实战
2026年7月28日 · termios API与C语言示例 · IT中华技术日记
IT中华 本文整理嵌入式 Linux 下串口(UART)应用编程的核心知识:termios 结构体配置、三种终端工作模式、串口编程六步流程,附完整 C 语言示例。
串口与终端设备节点
串口(UART)是嵌入式 Linux 常见外设,用于调试输出、数据通信、系统终端。Linux 中每个终端在 /dev 下有对应节点:
| 设备节点 | 说明 |
|---|---|
| /dev/ttyX | 本地终端(tty1~tty63) |
| /dev/pts/X | 伪终端(ssh/telnet) |
| /dev/ttymxcX | 串口终端(I.MX6U 平台) |
ALPHA/Mini I.MX6U 开发板有两个串口:/dev/ttymxc0(USB调试)和 /dev/ttymxc2(RS232/RS485)。
termios 结构体
Linux 将 ioctl() 封装为 termios API,串口编程核心是配置 struct termios 各成员:
struct termios {
tcflag_t c_iflag; /* 输入模式 */
tcflag_t c_oflag; /* 输出模式 */
tcflag_t c_cflag; /* 控制模式(最重要) */
tcflag_t c_lflag; /* 本地模式 */
cc_t c_cc[NCCS]; /* 特殊控制字符 */
speed_t c_ispeed; /* 输入速率 */
speed_t c_ospeed; /* 输出速率 */
};
配置原则:不要直接初始化赋值,应使用 &= 和 |= 添加或清除标志。
三种终端工作模式
| 模式 | 特点 |
|---|---|
| 规范模式 | 设置 ICANON(默认),基于行处理,read() 读到行结束符才返回 |
| 非规范模式 | 清除 ICANON,即时有效,由 MIN/TIME 控制 read() |
| 原始模式 | cfmakeraw(),数据以字节处理,不回显,禁用特殊处理 |
串口用于数据传输时必须用原始模式,确保数据不被解析为 ASCII。
串口编程六步流程
- 打开设备:
open("/dev/ttymxc2", O_RDWR | O_NOCTTY),必须加 O_NOCTTY 防御 Ctrl+C 误触 SIGINT - 保存原配置:
tcgetattr()获取当前参数以便恢复 - 配置参数:cfmakeraw → CREAD → cfsetspeed → CS8 → 校验位 → 停止位 → VMIN/VTIME=0
- 清空缓冲区:
tcflush(fd, TCIOFLUSH) - 写入生效:
tcsetattr(fd, TCSANOW, &new_cfg) - 读写数据:read() / write() 直接操作
关键配置代码片段
cfmakeraw(&new_cfg); new_cfg.c_cflag |= CREAD; // 使能接收 cfsetspeed(&new_cfg, B115200); // 波特率 new_cfg.c_cflag &= ~CSIZE; new_cfg.c_cflag |= CS8; // 8数据位 new_cfg.c_cflag &= ~PARENB; // 无校验 new_cfg.c_cflag &= ~CSTOPB; // 1停止位 new_cfg.c_cc[VTIME] = 0; new_cfg.c_cc[VMIN] = 0; // 非阻塞读 // 退出时恢复 cfsetospeed(&old_cfg, B115200); tcsetattr(fd, TCSANOW, &old_cfg); close(fd);
IT中华 小结:串口用于数据传输通信时,务必设为原始模式并加 O_NOCTTY。配置成员用 &= / |= 按位操作,避免直接赋值破坏其他标志位。
关于IT中华
IT中华(www.itzh.vip)持续关注嵌入式 Linux 与 C 语言开发。本文转载改写自博客园 Javenwww 的技术文章。关注IT中华,获取更多底层开发笔记。
IT中华 · www.itzh.vip · 技术日记