summaryrefslogtreecommitdiff
path: root/src/serialport/qserialport_win.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/serialport/qserialport_win.cpp')
-rw-r--r--src/serialport/qserialport_win.cpp22
1 files changed, 9 insertions, 13 deletions
diff --git a/src/serialport/qserialport_win.cpp b/src/serialport/qserialport_win.cpp
index 46fc9d9..9ab4448 100644
--- a/src/serialport/qserialport_win.cpp
+++ b/src/serialport/qserialport_win.cpp
@@ -210,7 +210,6 @@ void QSerialPortPrivate::close()
readStarted = false;
writeStarted = false;
writeBuffer.clear();
- actualBytesToWrite = 0;
if (settingsRestoredOnClose) {
::SetCommState(handle, &restoredDcb);
@@ -292,10 +291,8 @@ bool QSerialPortPrivate::clear(QSerialPort::Directions directions)
DWORD flags = 0;
if (directions & QSerialPort::Input)
flags |= PURGE_RXABORT | PURGE_RXCLEAR;
- if (directions & QSerialPort::Output) {
+ if (directions & QSerialPort::Output)
flags |= PURGE_TXABORT | PURGE_TXCLEAR;
- actualBytesToWrite = 0;
- }
if (!::PurgeComm(handle, flags)) {
setError(getSystemError());
return false;
@@ -369,7 +366,7 @@ bool QSerialPortPrivate::waitForReadyRead(int msecs)
bool QSerialPortPrivate::waitForBytesWritten(int msecs)
{
- if (writeBuffer.isEmpty())
+ if (writeBuffer.isEmpty() && writeChunkBuffer.isEmpty())
return false;
if (!writeStarted && !_q_startAsyncWrite())
@@ -498,12 +495,13 @@ bool QSerialPortPrivate::completeAsyncWrite(qint64 bytesTransferred)
if (writeStarted) {
if (bytesTransferred == qint64(-1)) {
+ writeChunkBuffer.clear();
writeStarted = false;
return false;
- } else if (bytesTransferred > 0) {
- writeBuffer.free(bytesTransferred);
- emit q->bytesWritten(bytesTransferred);
}
+ Q_ASSERT(bytesTransferred == writeChunkBuffer.size());
+ writeChunkBuffer.clear();
+ emit q->bytesWritten(bytesTransferred);
writeStarted = false;
}
@@ -570,10 +568,10 @@ bool QSerialPortPrivate::_q_startAsyncWrite()
if (writeBuffer.isEmpty() || writeStarted)
return true;
- const int writeBytes = writeBuffer.nextDataBlockSize();
+ writeChunkBuffer = writeBuffer.read();
::ZeroMemory(&writeCompletionOverlapped, sizeof(writeCompletionOverlapped));
- if (!::WriteFile(handle, writeBuffer.readPointer(),
- writeBytes, nullptr, &writeCompletionOverlapped)) {
+ if (!::WriteFile(handle, writeChunkBuffer.constData(),
+ writeChunkBuffer.size(), nullptr, &writeCompletionOverlapped)) {
QSerialPortErrorInfo error = getSystemError();
if (error.errorCode != QSerialPort::NoError) {
@@ -584,7 +582,6 @@ bool QSerialPortPrivate::_q_startAsyncWrite()
}
}
- actualBytesToWrite -= writeBytes;
writeStarted = true;
return true;
}
@@ -619,7 +616,6 @@ qint64 QSerialPortPrivate::writeData(const char *data, qint64 maxSize)
Q_Q(QSerialPort);
writeBuffer.append(data, maxSize);
- actualBytesToWrite += maxSize;
if (!writeBuffer.isEmpty() && !writeStarted) {
if (!startAsyncWriteTimer) {