diff options
-rw-r--r-- | src/serialport/qserialport_win.cpp | 13 | ||||
-rw-r--r-- | tests/auto/qserialport/tst_qserialport.cpp | 53 |
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())); |