summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/serialport/qserialport_win.cpp6
-rw-r--r--tests/auto/qserialport/tst_qserialport.cpp42
2 files changed, 48 insertions, 0 deletions
diff --git a/src/serialport/qserialport_win.cpp b/src/serialport/qserialport_win.cpp
index 3174db5..84d1db7 100644
--- a/src/serialport/qserialport_win.cpp
+++ b/src/serialport/qserialport_win.cpp
@@ -282,6 +282,12 @@ bool QSerialPortPrivate::clear(QSerialPort::Directions directions)
return false;
}
+ // We need start async read because a reading can be stalled. Since the
+ // PurgeComm can abort of current reading sequence, or a port is in hardware
+ // flow control mode, or a port has a limited read buffer size.
+ if (directions & QSerialPort::Input)
+ startAsyncRead();
+
return true;
}
diff --git a/tests/auto/qserialport/tst_qserialport.cpp b/tests/auto/qserialport/tst_qserialport.cpp
index 0fdde48..a7dc5f3 100644
--- a/tests/auto/qserialport/tst_qserialport.cpp
+++ b/tests/auto/qserialport/tst_qserialport.cpp
@@ -117,6 +117,7 @@ private slots:
#ifdef Q_OS_WIN
void readBufferOverflow();
+ void readAfterInputClear();
#endif
protected slots:
@@ -700,6 +701,47 @@ void tst_QSerialPort::readBufferOverflow()
// No more bytes available
QVERIFY(receiverPort.bytesAvailable() == 0);
}
+
+void tst_QSerialPort::readAfterInputClear()
+{
+ clearReceiver();
+
+ QSerialPort senderPort(m_senderPortName);
+ QVERIFY(senderPort.open(QSerialPort::WriteOnly));
+
+ QSerialPort receiverPort(m_receiverPortName);
+ QVERIFY(receiverPort.open(QSerialPort::ReadOnly));
+
+ const int readBufferSize = alphabetArray.size() / 2;
+ receiverPort.setReadBufferSize(readBufferSize);
+ QCOMPARE(receiverPort.readBufferSize(), qint64(readBufferSize));
+
+ const int waitMsecs = 100;
+
+ // First write more than read buffer size
+ QCOMPARE(senderPort.write(alphabetArray), qint64(alphabetArray.size()));
+ QVERIFY2(senderPort.waitForBytesWritten(waitMsecs), "Waiting for bytes written failed");
+
+ // Wait for first part of data into read buffer
+ while (receiverPort.waitForReadyRead(waitMsecs));
+ QCOMPARE(receiverPort.bytesAvailable(), qint64(readBufferSize));
+ // Wait for second part of data into driver's FIFO
+ QTest::qSleep(waitMsecs);
+
+ QVERIFY(receiverPort.clear(QSerialPort::Input));
+ QCOMPARE(receiverPort.bytesAvailable(), qint64(0));
+
+ // Second write less than read buffer size
+ QCOMPARE(senderPort.write(newlineArray), qint64(newlineArray.size()));
+ QVERIFY2(senderPort.waitForBytesWritten(waitMsecs), "Waiting for bytes written failed");
+
+ while (receiverPort.waitForReadyRead(waitMsecs));
+ QCOMPARE(receiverPort.bytesAvailable(), qint64(newlineArray.size()));
+ QCOMPARE(receiverPort.readAll(), newlineArray);
+
+ // No more bytes available
+ QVERIFY(receiverPort.bytesAvailable() == 0);
+}
#endif
QTEST_MAIN(tst_QSerialPort)