summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Shienkov <denis.shienkov@gmail.com>2016-09-10 20:56:42 +0300
committerDenis Shienkov <denis.shienkov@gmail.com>2016-09-23 05:39:23 +0000
commitdee818e77a6cf9a6c164fbc7ee132fe875f7f998 (patch)
treefe83d0b841894a8cb2055f942025843e08d510b5
parentfcd6ac231d160afd5c11cc5ef515dcc61c3eca3f (diff)
downloadqtserialport-dee818e77a6cf9a6c164fbc7ee132fe875f7f998.tar.gz
Do not reset RTS after changing other properties on Windows
Changing any of serial port properties drops RTS, which has been set earlier, since the fRtsControl field of DCB structure always has RTS_CONTROL_DISABLE value (except hardware flow control). Thus, using one EscapeCommFunction() function inside of QSP::setRequestToSend() method is not enough. We need set there also the fRtsControl field to RTS_CONTROL_ENABLE(DISABLE) value and keep it unchanged. Task-number: QTBUG-55907 Change-Id: I7e407b0de9f970f5d11f61c0e360d4735a0acb84 Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com> Reviewed-by: Denis Shienkov <denis.shienkov@gmail.com>
-rw-r--r--src/serialport/qserialport_win.cpp13
-rw-r--r--tests/auto/qserialport/tst_qserialport.cpp53
2 files changed, 64 insertions, 2 deletions
diff --git a/src/serialport/qserialport_win.cpp b/src/serialport/qserialport_win.cpp
index 9ab4448..84bf5b9 100644
--- a/src/serialport/qserialport_win.cpp
+++ b/src/serialport/qserialport_win.cpp
@@ -90,6 +90,9 @@ static inline void qt_set_common_props(DCB *dcb)
if (dcb->fDtrControl == DTR_CONTROL_HANDSHAKE)
dcb->fDtrControl = DTR_CONTROL_DISABLE;
+
+ if (dcb->fRtsControl != RTS_CONTROL_HANDSHAKE)
+ dcb->fRtsControl = RTS_CONTROL_DISABLE;
}
static inline void qt_set_baudrate(DCB *dcb, qint32 baudrate)
@@ -152,7 +155,8 @@ static inline void qt_set_flowcontrol(DCB *dcb, QSerialPort::FlowControl flowcon
dcb->fInX = FALSE;
dcb->fOutX = FALSE;
dcb->fOutxCtsFlow = FALSE;
- dcb->fRtsControl = RTS_CONTROL_DISABLE;
+ if (dcb->fRtsControl == RTS_CONTROL_HANDSHAKE)
+ dcb->fRtsControl = RTS_CONTROL_DISABLE;
switch (flowcontrol) {
case QSerialPort::NoFlowControl:
break;
@@ -278,7 +282,12 @@ bool QSerialPortPrivate::setRequestToSend(bool set)
return false;
}
- return true;
+ DCB dcb;
+ if (!getDcb(&dcb))
+ return false;
+
+ dcb.fRtsControl = set ? RTS_CONTROL_ENABLE : RTS_CONTROL_DISABLE;
+ return setDcb(&dcb);
}
bool QSerialPortPrivate::flush()
diff --git a/tests/auto/qserialport/tst_qserialport.cpp b/tests/auto/qserialport/tst_qserialport.cpp
index 33a48fe..94eaaa5 100644
--- a/tests/auto/qserialport/tst_qserialport.cpp
+++ b/tests/auto/qserialport/tst_qserialport.cpp
@@ -98,6 +98,7 @@ private slots:
void rts();
void dtr();
+ void independenceRtsAndDtr();
void flush();
void doubleFlush();
@@ -549,6 +550,58 @@ void tst_QSerialPort::dtr()
QCOMPARE(qvariant_cast<bool>(dtrSpy.at(2).at(0)), toggle3);
}
+void tst_QSerialPort::independenceRtsAndDtr()
+{
+ QSerialPort serialPort(m_senderPortName);
+ QVERIFY(serialPort.open(QIODevice::ReadWrite)); // No flow control by default!
+
+ QVERIFY(serialPort.setDataTerminalReady(true));
+ QVERIFY(serialPort.setRequestToSend(true));
+ QVERIFY(serialPort.isDataTerminalReady());
+ QVERIFY(serialPort.isRequestToSend());
+
+ // check that DTR changing does not change RTS
+ QVERIFY(serialPort.setDataTerminalReady(false));
+ QVERIFY(!serialPort.isDataTerminalReady());
+ QVERIFY(serialPort.isRequestToSend());
+ QVERIFY(serialPort.setDataTerminalReady(true));
+ QVERIFY(serialPort.isDataTerminalReady());
+ QVERIFY(serialPort.isRequestToSend());
+
+ // check that RTS changing does not change DTR
+ QVERIFY(serialPort.setRequestToSend(false));
+ QVERIFY(!serialPort.isRequestToSend());
+ QVERIFY(serialPort.isDataTerminalReady());
+ QVERIFY(serialPort.setRequestToSend(true));
+ QVERIFY(serialPort.isRequestToSend());
+ QVERIFY(serialPort.isDataTerminalReady());
+
+ // check that baud rate changing does not change DTR or RTS
+ QVERIFY(serialPort.setBaudRate(115200));
+ QVERIFY(serialPort.isRequestToSend());
+ QVERIFY(serialPort.isDataTerminalReady());
+
+ // check that data bits changing does not change DTR or RTS
+ QVERIFY(serialPort.setDataBits(QSerialPort::Data7));
+ QVERIFY(serialPort.isRequestToSend());
+ QVERIFY(serialPort.isDataTerminalReady());
+
+ // check that parity changing does not change DTR or RTS
+ QVERIFY(serialPort.setParity(QSerialPort::EvenParity));
+ QVERIFY(serialPort.isRequestToSend());
+ QVERIFY(serialPort.isDataTerminalReady());
+
+ // check that stop bits changing does not change DTR or RTS
+ QVERIFY(serialPort.setStopBits(QSerialPort::TwoStop));
+ QVERIFY(serialPort.isRequestToSend());
+ QVERIFY(serialPort.isDataTerminalReady());
+
+ // check that software flow control changing does not change DTR or RTS
+ QVERIFY(serialPort.setFlowControl(QSerialPort::SoftwareControl));
+ QVERIFY(serialPort.isRequestToSend());
+ QVERIFY(serialPort.isDataTerminalReady());
+}
+
void tst_QSerialPort::handleBytesWrittenAndExitLoopSlot(qint64 bytesWritten)
{
QCOMPARE(bytesWritten, qint64(alphabetArray.size() + newlineArray.size()));