news 2026/2/22 4:54:53

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/2/20 18:48:14

VRM模型转换实践指南:从基础构建到高级动画制作

VRM模型转换实践指南:从基础构建到高级动画制作 【免费下载链接】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/2/21 22:00:36

3步搞定MusicBee歌词插件:网易云音乐歌词同步终极指南

3步搞定MusicBee歌词插件:网易云音乐歌词同步终极指南 【免费下载链接】MusicBee-NeteaseLyrics A plugin to retrieve lyrics from Netease Cloud Music for MusicBee. 项目地址: https://gitcode.com/gh_mirrors/mu/MusicBee-NeteaseLyrics 想要在MusicBee…

作者头像 李华
网站建设 2026/2/19 0:13:15

手机号转QQ号终极指南:3步完成免费快速查询

手机号转QQ号终极指南:3步完成免费快速查询 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq 还在为忘记QQ号而烦恼?手机号转QQ号工具帮你轻松解决这个难题!这款基于Python3开发的免费开源工具&…

作者头像 李华
网站建设 2026/2/20 1:47:44

Android存储限制突破指南:NoStorageRestrict模块深度解析

Android存储限制突破指南:NoStorageRestrict模块深度解析 【免费下载链接】com.github.dan.nostoragerestrict NoStorageRestrict 项目地址: https://gitcode.com/gh_mirrors/co/com.github.dan.nostoragerestrict 在Android 11及更高版本中,系统…

作者头像 李华
网站建设 2026/2/21 1:09:46

Thorium浏览器:重新定义Chromium性能边界的终极解决方案

Thorium浏览器:重新定义Chromium性能边界的终极解决方案 【免费下载链接】thorium Chromium fork named after radioactive element No. 90. Windows and MacOS/Raspi/Android/Special builds are in different repositories, links are towards the top of the REA…

作者头像 李华