【发布时间】:2019-10-03 20:33:36
【问题描述】:
我正在尝试了解 Qt 的串行端口模块,但我不太熟悉 Qt 如何处理异步 I/O。在 Windows 上,QSerialPort::writeData 方法将要写入的数据放置在环形缓冲区中,然后在其timeout 信号触发时启动单次QTimer 以实际执行写入:
qint64 QSerialPortPrivate::writeData(const char *data, qint64 maxSize)
{
Q_Q(QSerialPort);
writeBuffer.append(data, maxSize);
if (!writeBuffer.isEmpty() && !writeStarted) {
if (!startAsyncWriteTimer) {
startAsyncWriteTimer = new QTimer(q);
QObjectPrivate::connect(startAsyncWriteTimer, &QTimer::timeout, this, &QSerialPortPrivate::_q_startAsyncWrite);
startAsyncWriteTimer->setSingleShot(true);
}
if (!startAsyncWriteTimer->isActive())
startAsyncWriteTimer->start();
}
return maxSize;
}
readData 方法没有这种方式使用定时器,而是直接调用ReadFileEx。
单次计时器与仅调用 WriteFileEx 相比有什么作用?
【问题讨论】:
-
一个优点是这允许将多个连续的写入调用合并为一个对
WriteFileEx的调用(例如:port.write("a"); port.write("b"); port.write("c");都转换为WriteFileEx("abc");)。我不确定是否还有更重要的。 -
可能是为了实现异步处理。根据设备驱动程序的实现和要发送的数据的大小,有人可能认为直接调用 WriteFileEx 会是一个同步过程。或者可能是打算实现 WriteData 的超时错误检测过程只是一个错误。
标签: windows qt serial-port qtserialport