diff options
-rw-r--r-- | src/serialport/qserialport_win.cpp | 6 | ||||
-rw-r--r-- | tests/auto/qserialport/tst_qserialport.cpp | 42 |
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) |