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

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. 多线程环境下需注意同步问题

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

http://www.cnnetsun.cn/news/188892.html

相关文章:

  • VRM模型转换实践指南:从基础构建到高级动画制作
  • 3步搞定MusicBee歌词插件:网易云音乐歌词同步终极指南
  • 手机号转QQ号终极指南:3步完成免费快速查询
  • 星图云开发者平台功能详解 | 业务逻辑编辑器:一拖一连,5分钟搞定复杂开发
  • Android存储限制突破指南:NoStorageRestrict模块深度解析
  • Thorium浏览器:重新定义Chromium性能边界的终极解决方案
  • 绝区零智能助手:全自动任务执行解决方案
  • 终极指南:如何在Android 11+系统中优化存储访问体验?
  • 3步搞定MusicBee网易云歌词插件:让音乐播放更完美
  • HashCalculator终极指南:3步掌握文件哈希值批量计算与校验
  • Minecraft终极光影指南:简单几步让方块世界焕然一新
  • 单机游戏分屏革命:Nucleus Co-Op让一台电脑变多人游戏厅
  • 自动驾驶硬件方案成本控制:从零开始的智能驾驶构建指南
  • 重返未来:1999终极自动化助手:彻底告别重复操作的游戏神器
  • 5分钟精通Chrome全页截图:Full Page Screen Capture终极使用指南
  • Nintendo Switch存储管理完全指南:从基础备份到高级分区优化
  • Full Page Screen Capture:彻底告别网页截图拼接时代
  • ThinkPad散热革命:TPFanCtrl2双风扇智能控制终极指南
  • 手把手教程:Ollydbg下载及安装从零开始配置
  • MusicBee网易云歌词插件终极配置指南:3步搞定同步歌词
  • 终极指南:为什么你需要SAI来管理拆分APK文件
  • Jellyfin Android TV版“自动连续播放“功能失效:从0.17.7版本bug到快速修复全记录
  • NoSleep防休眠工具终极指南:无需权限的Windows系统守护神器
  • WenQuanYi Micro Hei字体安装全攻略:跨平台部署与优化配置
  • 5分钟掌握Applite:macOS应用管理的终极解决方案
  • USB通信在数控机床中的数据传输应用:案例研究
  • 2026大模型产品经理学习路线全解析:从入门到精通_大模型产品经理学习路线
  • 网盘直链解析助手终极指南:八大平台高速下载解决方案
  • n8n+Ollama+Qwen3企业级RAG检索系统搭建指南,附完整代码和常见问题解决
  • Windows字体渲染终极优化指南:用MacType让文字如丝般顺滑✨