RTS/CTS硬件流控原理
串口 RTS/CTS 信号详解RTSRequest To Send请求发送和CTSClear To Send清除发送是串行通信如RS-232标准中用于实现硬件流控制Hardware Flow Control的一对关键信号线。它们的主要作用是协调发送方和接收方之间的数据传输速率防止因接收端缓冲区溢出而导致的数据丢失。一、 信号定义与功能信号名称英文全称方向 (以DTE为视角)功能描述RTSRequest To Send输出由数据终端设备DTE如计算机发出用于请求向数据通信设备DCE如调制解调器发送数据。它表明DTE已准备好发送。CTSClear To Send输入由DCE如调制解调器发出用于响应RTS请求。当DCE准备好接收数据时会置CTS为有效状态允许DTE开始传输。核心逻辑发送方DTE在发送数据前需先检查CTS信号是否有效通常为低电平。只有CTS有效时才能开始发送若CTS无效则必须暂停发送等待其重新有效。二、 工作原理与连接方式RTS/CTS流控属于硬件流控其工作不依赖于数据流中的特殊字符而是通过独立的物理信号线进行控制因此效率高、可靠性强。1. 标准连接DTE与DCE之间在标准的RS-232连接中如使用DB9接口RTS和CTS通常按如下方式交叉连接DTE的RTS引脚 连接至 DCE的CTS引脚。DTE的CTS引脚 连接至 DCE的RTS引脚。这种交叉连接实现了双向的握手协议。例如当计算机DTE想要发送数据时它先置高自己的RTS线请求发送。调制解调器DCE在自身就绪后会置高自己的RTS线该信号连接到计算机的CTS从而通知计算机“可以发送”。2. 三线制连接下的流控模拟在实际应用中特别是两个DTE设备如两台计算机直接相连时常采用简化的“三线制”仅连接TXD、RXD和GND。此时若需硬件流控可以通过软件配置和额外的连线模拟RTS/CTS功能。一种常见的做法是将一端的RTS连接到另一端的CTS实现单向或简单的双向流控。但更可靠的做法是完整连接RTS和CTS线。三、 应用场景与代码示例1. 应用场景高速或大数据量传输当串口波特率较高或数据传输不稳定时硬件流控能有效防止数据丢失。嵌入式系统与模块通信如单片机与GPS模块、GSM/GPRS模块如SIMCOM系列通信时启用RTS/CTS可确保AT指令或数据透传的可靠性。无线或有噪声环境在这些环境下通信可能不稳定硬件流控提供了底层的数据传输保障机制。2. Linux系统下串口配置示例在Linux中可以通过termios结构体配置串口启用硬件流控。#include stdio.h #include stdlib.h #include unistd.h #include fcntl.h #include termios.h #include string.h int configure_serial_port(int fd) { struct termios options; // 获取当前串口配置 if (tcgetattr(fd, options) 0) { perror(tcgetattr failed); return -1; } // 设置波特率为115200 cfsetispeed(options, B115200); cfsetospeed(options, B115200); // 启用接收器忽略调制解调器状态行 options.c_cflag | (CLOCAL | CREAD); // 设置8位数据位无奇偶校验1位停止位 options.c_cflag ~PARENB; // 无奇偶校验 options.c_cflag ~CSTOPB; // 1位停止位 options.c_cflag ~CSIZE; // 清除数据位掩码 options.c_cflag | CS8; // 设置8位数据位 // **关键配置启用硬件流控 (RTS/CTS)** options.c_cflag | CRTSCTS; // 启用RTS/CTS硬件流控 // 关闭软件流控 options.c_iflag ~(IXON | IXOFF | IXANY); // 设置为原始模式非规范模式禁用回显和信号处理 options.c_lflag ~(ICANON | ECHO | ECHOE | ISIG); options.c_oflag ~OPOST; // 原始输出 // 设置最小字符数和超时非规范模式下的读取行为 options.c_cc[VMIN] 1; // 至少读取1个字符 options.c_cc[VTIME] 10; // 超时时间为1.0秒 // 立即应用配置 if (tcsetattr(fd, TCSANOW, options) 0) { perror(tcsetattr failed); return -1; } return 0; } int main() { int serial_fd; const char *port_name /dev/ttyUSB0; // 串口设备文件 // 以读写和非阻塞方式打开串口 serial_fd open(port_name, O_RDWR | O_NOCTTY | O_NONBLOCK); if (serial_fd 0) { perror(open serial port failed); return -1; } // 配置串口包括启用硬件流控 if (configure_serial_port(serial_fd) 0) { close(serial_fd); return -1; } printf(Serial port %s configured with hardware flow control (RTS/CTS). , port_name); // ... 后续的读写操作 ... close(serial_fd); return 0; }代码说明此C程序演示了在Linux下如何打开并配置一个串口。关键步骤在于设置termios结构体的c_cflag成员通过options.c_cflag | CRTSCTS;这行代码启用RTS/CTS硬件流控。配置完成后操作系统内核会自动管理RTS和CTS信号应用程序只需进行常规的读写操作即可。四、 与其他流控方式的对比除了RTS/CTS硬件流控串口通信中还存在其他流控机制流控类型实现方式优点缺点典型应用硬件流控 (RTS/CTS)独立的物理信号线RTS, CTS响应快可靠性高不占用数据带宽。需要额外的连接线。高速、可靠的数据传输如调制解调器通信、工业控制。软件流控 (XON/XOFF)在数据流中插入特殊控制字符XON: 0x11, XOFF: 0x13无需额外物理连线仅需三线制。占用数据带宽不能用于二进制协议因可能与数据混淆效率较低。文本终端、低速且简单的数据传输场景。硬件流控 (DTR/DSR)使用DTRData Terminal Ready和DSRData Set Ready信号线可用于表示设备整体就绪状态。作为流控不如RTS/CTS常用和及时。通常用于设备连接建立阶段的握手而非持续的数据流控。总结RTS/CTS硬件流控通过专有的物理信号线实现了高效、可靠的数据传输速率匹配是串口通信中保证数据完整性的重要机制。在嵌入式开发、工业通信等要求高可靠性的场景下正确配置和使用RTS/CTS至关重要。参考来源UART串口的历史 转载【嵌入式开发】串口线中的RTS、CTS、DSR、DTR及DCD信号详解RS232串口之RTS与CTS作用模块串口RTS与CTS的理解与流控测试串口流控CTS/RTS使用详解串口流控CTS/RTS使用详解