diff options
author | Liang Qi <liang.qi@qt.io> | 2016-05-19 21:37:33 +0200 |
---|---|---|
committer | Liang Qi <liang.qi@qt.io> | 2016-05-19 21:37:33 +0200 |
commit | 9e8daaed0466d760e047c5da58811e55e7807c0a (patch) | |
tree | eb75deaa8be7b1bbd777416aa1995990cd0f86a1 /src | |
parent | 2ac9c0c0e6210f73884bbe2bcb3d8269519003a8 (diff) | |
parent | 9c9255eda50af191636ff9f18df35567c307dd8c (diff) | |
download | qtserialport-9e8daaed0466d760e047c5da58811e55e7807c0a.tar.gz |
Merge remote-tracking branch 'origin/5.6' into 5.7
Conflicts:
.qmake.conf
Change-Id: I6a4c3e446633e6f142b87c268096b1bdc1598a62
Diffstat (limited to 'src')
-rw-r--r-- | src/serialport/doc/qtserialport.qdocconf | 2 | ||||
-rw-r--r-- | src/serialport/qserialport_p.h | 2 | ||||
-rw-r--r-- | src/serialport/qserialport_unix.cpp | 12 | ||||
-rw-r--r-- | src/serialport/qserialport_win.cpp | 29 | ||||
-rw-r--r-- | src/serialport/qserialportinfo_unix.cpp | 2 |
5 files changed, 27 insertions, 20 deletions
diff --git a/src/serialport/doc/qtserialport.qdocconf b/src/serialport/doc/qtserialport.qdocconf index ac1fc1e..78c1b35 100644 --- a/src/serialport/doc/qtserialport.qdocconf +++ b/src/serialport/doc/qtserialport.qdocconf @@ -34,7 +34,7 @@ exampledirs += ../../../examples/serialport imagedirs += images excludedirs += ../qt4support -examplesinstallpath = qtserialport/serialport +examplesinstallpath = serialport depends += qtcore qtdoc qtnetwork qmake diff --git a/src/serialport/qserialport_p.h b/src/serialport/qserialport_p.h index ae2089d..cb300ad 100644 --- a/src/serialport/qserialport_p.h +++ b/src/serialport/qserialport_p.h @@ -188,6 +188,8 @@ public: bool getDcb(DCB *dcb); OVERLAPPED *waitForNotified(int msecs); + qint64 queuedBytesCount(QSerialPort::Direction direction) const; + bool completeAsyncCommunication(qint64 bytesTransferred); bool completeAsyncRead(qint64 bytesTransferred); bool completeAsyncWrite(qint64 bytesTransferred); diff --git a/src/serialport/qserialport_unix.cpp b/src/serialport/qserialport_unix.cpp index 41dad55..2d49822 100644 --- a/src/serialport/qserialport_unix.cpp +++ b/src/serialport/qserialport_unix.cpp @@ -250,15 +250,11 @@ void QSerialPortPrivate::close() ::ioctl(descriptor, TIOCNXCL); #endif - if (readNotifier) { - delete readNotifier; - readNotifier = Q_NULLPTR; - } + delete readNotifier; + readNotifier = Q_NULLPTR; - if (writeNotifier) { - delete writeNotifier; - writeNotifier = Q_NULLPTR; - } + delete writeNotifier; + writeNotifier = Q_NULLPTR; qt_safe_close(descriptor); diff --git a/src/serialport/qserialport_win.cpp b/src/serialport/qserialport_win.cpp index 36e7164..5dccd39 100644 --- a/src/serialport/qserialport_win.cpp +++ b/src/serialport/qserialport_win.cpp @@ -112,15 +112,11 @@ void QSerialPortPrivate::close() { ::CancelIo(handle); - if (notifier) { - delete notifier; - notifier = Q_NULLPTR; - } + delete notifier; + notifier = Q_NULLPTR; - if (startAsyncWriteTimer) { - delete startAsyncWriteTimer; - startAsyncWriteTimer = Q_NULLPTR; - } + delete startAsyncWriteTimer; + startAsyncWriteTimer = Q_NULLPTR; communicationStarted = false; readStarted = false; @@ -443,10 +439,13 @@ bool QSerialPortPrivate::completeAsyncRead(qint64 bytesTransferred) readStarted = false; bool result = true; - if (bytesTransferred == ReadChunkSize) + if (bytesTransferred == ReadChunkSize + || queuedBytesCount(QSerialPort::Input) > 0) { result = startAsyncRead(); - else if (readBufferMaxSize == 0 || readBufferMaxSize > buffer.size()) + } else if (readBufferMaxSize == 0 + || readBufferMaxSize > buffer.size()) { result = startAsyncCommunication(); + } if (bytesTransferred > 0) emitReadyRead(); @@ -604,6 +603,16 @@ OVERLAPPED *QSerialPortPrivate::waitForNotified(int msecs) return overlapped; } +qint64 QSerialPortPrivate::queuedBytesCount(QSerialPort::Direction direction) const +{ + COMSTAT comstat; + if (::ClearCommError(handle, Q_NULLPTR, &comstat) == 0) + return -1; + return (direction == QSerialPort::Input) + ? comstat.cbInQue + : ((direction == QSerialPort::Output) ? comstat.cbOutQue : -1); +} + inline bool QSerialPortPrivate::initialize() { Q_Q(QSerialPort); diff --git a/src/serialport/qserialportinfo_unix.cpp b/src/serialport/qserialportinfo_unix.cpp index 3a37999..08e75c1 100644 --- a/src/serialport/qserialportinfo_unix.cpp +++ b/src/serialport/qserialportinfo_unix.cpp @@ -157,7 +157,7 @@ static bool isRfcommDevice(const QString &portName) return false; bool ok; - const int portNumber = portName.mid(6).toInt(&ok); + const int portNumber = portName.midRef(6).toInt(&ok); if (!ok || (portNumber < 0) || (portNumber > 255)) return false; return true; |