当前位置: 首页 > 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.jsqmd.com/news/125014/

相关文章:

  • 网盘直链解析终极方案:简单三步实现免会员高速下载
  • Steam成就管理器完全指南:轻松解锁所有游戏成就
  • CoT论文阅读笔记
  • Thorium浏览器技术评测:Chromium生态的高性能定制方案
  • 一文说清USB3.0接口定义引脚说明与EMI防护设计
  • 终极抠图指南:如何用Krita AI插件3分钟完成专业级选区
  • 词达人全自动助手:高效完成英语词汇任务的智能解决方案
  • 天然气销售优秀的系统模拟面试
  • Steam Achievement Manager 成就管理全攻略
  • Obsidian PDF Plus:彻底改变你的PDF阅读与笔记体验
  • Comics Downloader终极教程:一站式漫画资源获取方案
  • STM32单片机分享:校园智慧教室系统
  • 网盘直链下载助手:告别限速的全平台下载神器
  • 网盘直链下载助手:2025年最高效的下载解决方案
  • 革命性实时语音转文字:你的会议记录神器
  • CTF流量分析工具:从零开始的实战指南
  • 鸣潮智能助手终极指南:从新手到专家的完整使用教程
  • 网盘解析神器完全指南:告别限速的终极下载方案
  • ThinkPad散热革命:TPFanCtrl2双风扇智能控制终极指南
  • WinDbg新手教程:轻松理解!analyze命令用法
  • 虚幻引擎Pak文件解析工具:告别资源黑盒的开发利器
  • React中setState后获取更新后值的完整解决方案
  • DFRDisplayKm完整教程:在Windows中完美解锁MacBook Pro Touch Bar功能
  • 下一代连接框架:Wi-Fi 8 与智能体人工智能的协同演进
  • ComfyUI-Florence2视觉语言模型实战指南
  • AirPodsDesktop终极指南:在Windows上解锁AirPods完整功能体验
  • 网盘直链下载助手:高效获取下载链接的浏览器插件
  • NoSleep:轻量级Windows防休眠工具,让电脑永不停歇
  • 从零实现:在Windows笔记本上部署Packet Tracer实验平台
  • NxNandManager完全攻略:Switch存储管理的终极解决方案