当前位置:首页 > C > 正文

深入理解 C语言 termios.h 库(小白也能掌握的 Linux 终端与串口通信编程指南)

在嵌入式开发、系统编程或设备通信中,C语言 是一门基础而强大的语言。而当你需要与串口设备(如 Arduino、GPS 模块、蓝牙模块等)进行通信,或者需要精细控制 Linux 终端行为时,termios.h 头文件就显得尤为重要。本文将带你从零开始,详细讲解 termios.h 库的基本使用方法,即使你是编程小白,也能轻松上手。

深入理解 C语言 termios.h 库(小白也能掌握的 Linux 终端与串口通信编程指南) 串口通信 Linux终端控制 第1张

什么是 termios.h?

termios.h 是 POSIX 标准中用于控制终端 I/O(输入/输出)的头文件。它提供了一套结构体和函数,允许你配置串行端口(如 /dev/ttyS0、/dev/ttyUSB0)或标准输入(stdin)的行为,比如波特率、数据位、停止位、奇偶校验、回显开关等。

Linux终端控制串口通信 场景中,termios.h 是不可或缺的工具。

核心结构:struct termios

使用 termios.h 的关键在于 struct termios 结构体。它包含多个字段,用于描述终端的当前配置:

  • c_iflag:输入模式标志(如是否处理特殊字符)
  • c_oflag:输出模式标志
  • c_cflag:控制模式标志(如波特率、数据位、停止位)
  • c_lflag:本地模式标志(如是否启用回显)
  • c_cc[]:特殊字符数组(如 Ctrl+C 的中断字符)

常用函数

操作 termios 配置主要用到以下三个函数:

  • tcgetattr(fd, &options):获取当前终端属性
  • tcsetattr(fd, TCSANOW, &options):立即应用新的终端属性
  • cfmakeraw(&options):将终端设置为原始模式(常用于串口通信)

实战:打开并配置串口

下面是一个完整的 C 语言示例,展示如何使用 termios.h 打开串口设备(例如 /dev/ttyUSB0),并将其配置为 9600 波特率、8 数据位、无奇偶校验、1 停止位(即“8N1”格式)。

#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <fcntl.h>#include <errno.h>#include <termios.h>#include <string.h>int open_serial_port(const char *port) {    int fd = open(port, O_RDWR | O_NOCTTY | O_SYNC);    if (fd < 0) {        perror("Error opening serial port");        return -1;    }    struct termios tty;    if (tcgetattr(fd, &tty) != 0) {        perror("Error from tcgetattr");        close(fd);        return -1;    }    // 设置为原始模式(禁用回显、行缓冲等)    cfmakeraw(&tty);    // 设置波特率为 9600    cfsetospeed(&tty, B9600);    cfsetispeed(&tty, B9600);    // 设置数据位、停止位、奇偶校验(8N1)    tty.c_cflag &= ~PARENB;            // 无奇偶校验    tty.c_cflag &= ~CSTOPB;            // 1 个停止位    tty.c_cflag &= ~CSIZE;             // 清除数据位掩码    tty.c_cflag |= CS8;                // 8 位数据    // 禁用硬件流控    tty.c_cflag &= ~CRTSCTS;    // 启用接收器,忽略调制解调器控制线    tty.c_cflag |= CREAD | CLOCAL;    // 应用配置    if (tcsetattr(fd, TCSANOW, &tty) != 0) {        perror("Error from tcsetattr");        close(fd);        return -1;    }    return fd;}int main() {    int serial_fd = open_serial_port("/dev/ttyUSB0");    if (serial_fd < 0) {        fprintf(stderr, "Failed to open serial port\n");        return EXIT_FAILURE;    }    printf("Serial port opened successfully!\n");    // 这里可以使用 read() 和 write() 进行通信    // 例如:write(serial_fd, "Hello", 5);    close(serial_fd);    return EXIT_SUCCESS;}

注意事项

  • 确保你有权限访问串口设备(通常需要加入 dialout 用户组)
  • 不同平台(如 macOS)的 termios 实现有细微差异
  • 串口通信是阻塞操作,必要时可配合 select() 或多线程使用

总结

通过本文,你应该已经掌握了 C语言 中使用 termios.h 进行 Linux终端控制串口通信 的基本方法。无论是调试嵌入式设备,还是编写底层通信程序,这项技能都非常实用。

记住:实践是最好的老师。尝试连接一个真实的串口设备,运行上面的代码,观察效果,你会进步得更快!

关键词回顾:C语言、termios.h、串口通信、Linux终端控制