news 2026/6/10 5:16:15

Linux串口通信参数设置标志详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux串口通信参数设置标志详解

Linux串口通信参数设置标志详解

1.核心数据结构:termios

structtermios{tcflag_tc_iflag;// 输入模式标志tcflag_tc_oflag;// 输出模式标志tcflag_tc_cflag;// 控制模式标志tcflag_tc_lflag;// 本地模式标志cc_tc_cc[NCCS];// 控制字符数组speed_tc_ispeed;// 输入波特率speed_tc_ospeed;// 输出波特率};

2.控制模式标志 (c_cflag)

数据位设置

// 数据位宽度CS5// 5位数据位CS6// 6位数据位CS7// 7位数据位CS8// 8位数据位// 使用方法options.c_cflag&=~CSIZE;// 清除当前数据位设置options.c_cflag|=CS8;// 设置8位数据位

停止位

CSTOPB// 2位停止位(置1时),默认1位停止位(清零时)// 1位停止位options.c_cflag&=~CSTOPB;// 2位停止位options.c_cflag|=CSTOPB;

校验位

PARENB// 启用奇偶校验PARODD// 奇校验(与PARENB一起使用)// 无校验options.c_cflag&=~PARENB;// 奇校验options.c_cflag|=(PARENB|PARODD);// 偶校验options.c_cflag|=PARENB;options.c_cflag&=~PARODD;

硬件流控制

CRTSCTS// 启用RTS/CTS硬件流控制// 启用硬件流控制options.c_cflag|=CRTSCTS;// 禁用硬件流控制options.c_cflag&=~CRTSCTS;

其他重要标志

CREAD// 启用接收器CLOCAL// 忽略调制解调器控制线HUPCL// 关闭时挂断调制解调器options.c_cflag|=(CLOCAL|CREAD);// 通常启用这两个标志

3.输入模式标志 (c_iflag)

软件流控制

IXON// 启用输出软件流控制IXOFF// 启用输入软件流控制IXANY// 允许任意字符重新启动输出// 启用XON/XOFF软件流控制options.c_iflag|=(IXON|IXOFF|IXANY);// 禁用软件流控制options.c_iflag&=~(IXON|IXOFF|IXANY);

输入处理

INPCK// 启用输入奇偶校验检查IGNPAR// 忽略奇偶校验错误PARMRK// 标记奇偶校验错误ISTRIP// 剥离第8位(将8位转为7位)IGNBRK// 忽略BREAK条件BRKINT// BREAK产生中断信号INLCR// 将NL转换为CRIGNCR// 忽略CRICRNL// 将CR转换为NLIUCLC// 将大写转换为小写IMAXBEL// 输入缓冲区满时响铃// 常用设置(原始模式)options.c_iflag&=~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);

4.输出模式标志 (c_oflag)

OPOST// 启用输出处理OLCUC// 将小写转换为大写ONLCR// 将NL转换为CR-NLOCRNL// 将CR转换为NLONOCR// 第0列无CR输出ONLRET// NL执行CR功能OFILL// 使用填充字符OFDEL// 填充字符为DELNLDLY// NL延迟掩码CRDLY// CR延迟掩码TABDLY// TAB延迟掩码BSDLY// BS延迟掩码VTDLY// VT延迟掩码FFDLY// FF延迟掩码// 原始输出模式(禁用所有输出处理)options.c_oflag=0;// 启用输出处理(如将\n转换为\r\n)options.c_oflag|=(OPOST|ONLCR);

5.本地模式标志 (c_lflag)

ICANON// 规范模式(启用行编辑)ECHO// 回显输入字符ECHOE// 规范模式下,ERASE字符擦除前一个字符ECHOK// 规范模式下,KILL字符擦除当前行ECHONL// 回显NL字符ISIG// 启用信号IEXTEN// 启用扩展功能NOFLSH// 中断时不刷新缓冲区TOSTOP// 后台作业尝试写终端时发送信号// 非规范模式(原始模式)设置options.c_lflag&=~(ICANON|ECHO|ECHOE|ISIG|IEXTEN);// 规范模式(带行编辑)设置options.c_lflag|=(ICANON|ECHO|ECHOE);

6.控制字符 (c_cc数组)

规范模式控制字符

c_cc[VINTR]// 中断字符(默认Ctrl-C)c_cc[VQUIT]// 退出字符(默认Ctrl-\)c_cc[VERASE]// 擦除字符(默认Backspace)c_cc[VKILL]// 终止行字符(默认Ctrl-U)c_cc[VEOF]// EOF字符(默认Ctrl-D)c_cc[VEOL]// 附加行结束符c_cc[VEOL2]// 第二行结束符c_cc[VSTART]// 开始字符(默认Ctrl-Q)c_cc[VSTOP]// 停止字符(默认Ctrl-S)

非规范模式超时设置

c_cc[VTIME]// 超时时间(十分之一秒)c_cc[VMIN]// 最小读取字符数// 常用组合// 1. 阻塞读取,直到读取至少1个字符options.c_cc[VTIME]=0;options.c_cc[VMIN]=1;// 2. 立即返回,无论是否读取到字符options.c_cc[VTIME]=0;options.c_cc[VMIN]=0;// 3. 超时读取:等待最多1秒options.c_cc[VTIME]=10;// 10 * 0.1秒 = 1秒options.c_cc[VMIN]=0;

7.波特率设置

// 标准波特率常量B0,B50,B75,B110,B134,B150,B200,B300,B600,B1200,B1800,B2400,B4800,B9600,B19200,B38400,B57600,B115200,B230400,B460800,B500000,B576000,B921600,B1000000,B1152000,B1500000,B2000000,B2500000,B3000000,B3500000,B4000000// 设置函数cfsetispeed(&options,B115200);// 输入波特率cfsetospeed(&options,B115200);// 输出波特率// 获取函数speed_tispeed=cfgetispeed(&options);speed_tospeed=cfgetospeed(&options);

8.完整配置示例

intconfigure_serial(intfd,speed_tbaudrate){structtermiosoptions;// 获取当前设置if(tcgetattr(fd,&options)!=0){perror("tcgetattr");return-1;}// 设置输入输出波特率cfsetispeed(&options,baudrate);cfsetospeed(&options,baudrate);// 控制标志设置options.c_cflag&=~CSIZE;// 清除数据位掩码options.c_cflag|=CS8;// 8位数据位options.c_cflag&=~PARENB;// 无校验options.c_cflag&=~CSTOPB;// 1位停止位options.c_cflag&=~CRTSCTS;// 无硬件流控制options.c_cflag|=(CLOCAL|CREAD);// 本地连接,启用接收// 输入标志设置options.c_iflag&=~(IXON|IXOFF|IXANY);// 无软件流控制options.c_iflag&=~(INLCR|ICRNL|IGNCR);// 禁止输入转换// 输出标志设置options.c_oflag=0;// 原始输出// 本地标志设置options.c_lflag=0;// 非规范模式,无信号// 控制字符设置options.c_cc[VTIME]=0;// 无超时options.c_cc[VMIN]=1;// 至少读取1个字符// 清空缓冲区并应用设置tcflush(fd,TCIOFLUSH);if(tcsetattr(fd,TCSANOW,&options)!=0){perror("tcsetattr");return-1;}return0;}

9.实用函数

// 清空缓冲区tcflush(fd,TCIFLUSH);// 清空输入队列tcflush(fd,TCOFLUSH);// 清空输出队列tcflush(fd,TCIOFLUSH);// 清空输入输出队列// 设置属性时机tcsetattr(fd,TCSANOW,&options);// 立即生效tcsetattr(fd,TCSADRAIN,&options);// 当前输出完成后生效tcsetattr(fd,TCSAFLUSH,&options);// 当前输出完成并清空输入后生效

10.注意事项

  1. 修改串口参数前需先获取当前设置
  2. 对于USB转串口设备,使用/dev/ttyUSB*/dev/ttyACM*
  3. 非标准波特率需要使用termios2结构体
  4. 多线程环境下需注意同步问题

这些标志可以灵活组合以满足不同的串口通信需求,从简单的原始二进制数据传输到复杂的终端交互都能支持。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/7 23:22:11

Obsidian PDF Plus终极指南:如何实现PDF与笔记的无缝双向链接

Obsidian PDF Plus终极指南:如何实现PDF与笔记的无缝双向链接 【免费下载链接】obsidian-pdf-plus An Obsidian.md plugin for annotating PDF files with highlights just by linking to text selection. It also adds many quality-of-life improvements to Obsid…

作者头像 李华
网站建设 2026/6/7 2:14:36

HBase可视化工具终极指南:从入门到精通

HBase可视化工具终极指南:从入门到精通 【免费下载链接】HbaseGUI HbaseGUI 项目地址: https://gitcode.com/gh_mirrors/hb/HbaseGUI 🚀 项目亮点速览 HBase作为分布式列式数据库的佼佼者,其强大的存储能力往往伴随着复杂的命令行操作…

作者头像 李华
网站建设 2026/6/9 10:47:36

CTF流量分析神器:NetA工具快速上手全攻略

CTF流量分析神器:NetA工具快速上手全攻略 【免费下载链接】CTF-NetA 项目地址: https://gitcode.com/gh_mirrors/ct/CTF-NetA 三步完成复杂流量解析,让新手也能轻松应对CTF挑战 在网络安全竞赛中,流量分析往往是让新手望而却步的难题…

作者头像 李华
网站建设 2026/6/8 20:22:14

VRM转换器终极指南:PMX兼容与骨骼映射深度解析

VRM转换器终极指南:PMX兼容与骨骼映射深度解析 【免费下载链接】VRM-Addon-for-Blender VRM Importer, Exporter and Utilities for Blender 2.93 or later 项目地址: https://gitcode.com/gh_mirrors/vr/VRM-Addon-for-Blender VRM-Addon-for-Blender项目作…

作者头像 李华
网站建设 2026/6/9 10:13:20

打破平台壁垒:3步搞定Steam创意工坊免账号模组下载

还在为Epic或GOG平台无法使用Steam创意工坊的精彩模组而烦恼吗?WorkshopDL正是你需要的解决方案——这款强大的工具让你无需Steam账号,就能直接下载创意工坊中的任何模组内容!无论你的游戏来自哪个平台,现在都能享受到Steam生态的…

作者头像 李华
网站建设 2026/6/9 12:31:00

网盘直链下载助手:2025年终极下载加速方案

还在为网盘限速而苦恼吗?网盘直链下载助手为您提供完美的下载体验,支持八大主流网盘的高速下载,无需安装客户端即可享受全速下载的便捷。作为2025年最实用的下载工具,这款开源项目通过技术创新彻底改变了传统下载方式,…

作者头像 李华