为何在Termios串口接口保留现有设置?开源软件串口配置修复问询
完善串口基础字节收发的termios配置
我懂你要给开源项目贡献串口配置的修复代码——原代码只清除了ONLCR标志确实远远不够,要实现无奇偶校验、无流控(包括XON/XOFF)、无规范模式的基础字节收发,得把termios结构体的几个关键部分都配置到位。
下面是一套完整的配置代码,你可以替换或补充原项目中的串口初始化逻辑:
#include <termios.h> #include <unistd.h> // 假设fd是已打开的串口文件描述符 struct termios uart_config; // 先获取当前串口配置 if (tcgetattr(fd, &uart_config) != 0) { // 错误处理,比如perror("tcgetattr failed"); return -1; } // 1. 禁用规范模式、回显、信号处理(无规范模式核心) uart_config.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // ICANON:关闭规范模式,让串口以原始字节方式收发 // ECHO/ECHOE:关闭输入回显和退格处理 // ISIG:禁用终端信号(比如Ctrl+C、Ctrl+Z) // 2. 禁用输出换行转换(保留原项目的ONLCR清除,补充其他可能的转换) uart_config.c_oflag &= ~(ONLCR | OCRNL | ONLRET | ONOCR); // ONLCR:禁止将NL转换为CR+NL(原项目已处理) // 其他几个标志防止其他换行相关的转换,确保输出字节原样发送 // 3. 禁用输入流控和奇偶校验相关处理 uart_config.c_iflag &= ~(IXON | IXOFF | IXANY); // 禁用XON/XOFF软件流控 uart_config.c_iflag &= ~(INPCK | ISTRIP | PARMRK); // 关闭奇偶校验检测和字节剥离 // 4. 核心控制配置:无奇偶、1停止位、8位数据位、禁用硬件流控 uart_config.c_cflag &= ~PARENB; // 禁用奇偶校验 uart_config.c_cflag &= ~CSTOPB; // 设置1位停止位(默认是1位,清除该标志确保) uart_config.c_cflag |= CS8; // 设置8位数据位 uart_config.c_cflag &= ~CRTSCTS;// 禁用RTS/CTS硬件流控 uart_config.c_cflag |= CLOCAL | CREAD; // 忽略modem控制线,允许接收数据 // 5. 无规范模式下的收发超时配置(按需调整) // 这里设置为:至少接收1字节,无超时(单字节阻塞接收) uart_config.c_cc[VMIN] = 1; uart_config.c_cc[VTIME] = 0; // 应用配置,立即生效 if (tcsetattr(fd, TCSANOW, &uart_config) != 0) { // 错误处理 return -1; }
关键配置说明:
- 无规范模式:核心是关闭
ICANON,这样串口不会把输入当成行处理,而是直接收发单个字节,这是基础字节收发的前提。 - 无流控:同时禁用软件流控(
IXON/IXOFF/IXANY)和硬件流控(CRTSCTS),确保数据不受流控机制干扰。 - 无奇偶校验:清除
PARENB标志,配合CS8设置8位数据位,完全符合你需要的基础收发要求。
把这套配置加到原项目中,就能覆盖原代码的不足,满足Ubuntu PC和外设之间的基础字节收发需求了。
内容的提问来源于stack exchange,提问作者DaJC
相关产品推荐
相关产品推荐

