1.概要
2.内容
在串口通信中,流量控制(Flow Control) 是用于协调发送方和接收方数据传输速率的关键机制,可防止因接收方处理速度不足导致的数据丢失。QSerialPort
支持三种流控模式,以下是详细解释和配置方法:
一、流控的三种模式
1. 无流控(NoFlowControl
)
- 原理:不使用任何流控机制,发送方持续发送数据,接收方需自行处理数据缓冲。
- 适用场景:
- 短距离、低速通信(如调试串口)
- 接收方处理能力远高于发送方
- 风险:高速传输时可能出现缓冲区溢出导致数据丢失。
2. 硬件流控(HardwareControl
)
- 原理:通过专用信号线控制数据流:
- RTS(Request To Send):发送方请求发送数据
- CTS(Clear To Send):接收方允许发送数据
- 接线要求:
- 需要连接 RTS/CTS 引脚(通常为串口的引脚7和8)
- 适用场景:
- 长距离传输
- 高速数据传输(如工业控制、嵌入式系统)
3. 软件流控(SoftwareControl
)
- 原理:通过特定控制字符暂停/恢复传输:
- XON(0x11):接收方准备好,发送方可继续传输
- XOFF(0x13):接收方繁忙,发送方暂停传输
- 适用场景:
- 没有硬件流控引脚的场景(如USB转串口)
- 低速通信且数据中不包含XON/XOFF字符
- 风险:若数据本身包含
0x11
或0x13
字符,会导致流控意外触发。
二、Qt中的流控配置
1. 设置流控模式
// 无流控(默认)
serial->setFlowControl(QSerialPort::NoFlowControl);
// 硬件流控
serial->setFlowControl(QSerialPort::HardwareControl);
// 软件流控
serial->setFlowControl(QSerialPort::SoftwareControl);
2. 软件流控特殊配置
// 设置XON/XOFF字符(默认已为0x11和0x13)
serial->setXonChar(0x11);
serial->setXoffChar(0x13);
三、流控模式对比
特性 | 无流控 | 硬件流控 | 软件流控 |
---|---|---|---|
传输可靠性 | 低 | 高 | 中 |
硬件要求 | 无 | 需RTS/CTS引脚 | 无 |
传输延迟 | 最低 | 中 | 较高 |
适用数据类型 | 非实时数据 | 实时控制数据 | 文本类数据 |
典型场景 | 调试日志 | 工业设备通信 | 旧式终端通信 |
四、流控调试技巧
1. 硬件流控验证
# Linux下使用stty命令查看流控设置
stty -F /dev/ttyUSB0 -a | grep flow
输出应包含 crtscts
(硬件流控标志)。
2. 软件流控测试
// 发送方代码
serial->write(QByteArray::fromHex("11")); // 发送XON
// 接收方代码
if (data == QByteArray::fromHex("13")) {
// 处理XOFF
}
3. 流控失效排查
- 硬件流控:
- 检查RTS/CTS引脚是否焊接正确
- 使用万用表测量信号线电压变化
- 软件流控:
- 确保数据中不包含
0x11
/0x13
字符 - 尝试更换非标准控制字符(如
0x02
/0x03
)
- 确保数据中不包含
五、典型应用场景选择
-
工业设备通信(如PLC)
→ 硬件流控(确保实时性) -
GPS模块数据读取
→ 无流控(GPS数据速率稳定且较低) -
老式打印机通信
→ 软件流控(兼容旧设备)
通过合理选择流控模式,可显著提升串口通信的可靠性,特别是在嵌入式系统和工业控制领域,流控配置是保障系统稳定运行的关键环节。
3.关联链接
4.关联知识