diff options
author | Denis Shienkov <denis.shienkov@gmail.com> | 2014-10-03 13:21:17 +0400 |
---|---|---|
committer | Denis Shienkov <denis.shienkov@gmail.com> | 2014-10-03 13:32:01 +0200 |
commit | 9c88ad89801596e1d94acc4f32ff55c34118a66f (patch) | |
tree | 18f3150a0ab599b082f3b5813e833e0fe6886f4a /tests/auto | |
parent | ac0422e8c9e74f2275129e3c7c69ef64299f07a9 (diff) | |
download | qtserialport-9c88ad89801596e1d94acc4f32ff55c34118a66f.tar.gz |
Restart of async reading when a QSP::clear() is called
The method QSP::clear() can stall reading in case of following
situations:
- at the moment when PurgeComm abort of previously started
asynchronous reading operation
- when a serial port is in hardware flow control mode
- when a serial port has a limited read buffer size
Therefore is necessary restart of asynchronous reading to enable
of the read sequence.
Change-Id: I7a722a1ee20ecba0dd631da96ca81d2937d7ca6b
Reviewed-by: Robert Kurjata <rkurjata@gmail.com>
Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
Diffstat (limited to 'tests/auto')
-rw-r--r-- | tests/auto/qserialport/tst_qserialport.cpp | 42 |
1 files changed, 42 insertions, 0 deletions
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) |