$kernelink route --hydrate --safe

页面加载 /
跳到正文
17.md
workspace / posts
~/posts/17.md 阅读中

嵌入式Linux串口应用编程实战:termios配置与C示例

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。

串口编程六步流程

  1. 打开设备open("/dev/ttymxc2", O_RDWR | O_NOCTTY),必须加 O_NOCTTY 防御 Ctrl+C 误触 SIGINT
  2. 保存原配置tcgetattr() 获取当前参数以便恢复
  3. 配置参数:cfmakeraw → CREAD → cfsetspeed → CS8 → 校验位 → 停止位 → VMIN/VTIME=0
  4. 清空缓冲区tcflush(fd, TCIOFLUSH)
  5. 写入生效tcsetattr(fd, TCSANOW, &new_cfg)
  6. 读写数据: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 · 技术日记

comments.cmd 可写入
guest@kernelink:~/posts/17$ comment --compose
identity.env 访客信息
插入 访客会话 Text + UBB · UTF-8 · LF 0 字符