summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Shienkov <denis.shienkov@gmail.com>2015-09-10 16:25:15 +0300
committerDenis Shienkov <denis.shienkov@gmail.com>2015-09-24 16:22:58 +0000
commit2e7e58c7f225ee2237b27285c19a060a277e35fe (patch)
treeb7b8e53103713abc588c2a4edf23c67a0ea1f8e7
parent5c0fed7b7c19641e0dcc7740277ac5f54422b4bf (diff)
downloadqtserialport-2e7e58c7f225ee2237b27285c19a060a277e35fe.tar.gz
Cleanup remainders of code relating to data error policy handling
It is impossible to implement all these features on all platforms, and particular drivers may not support them, too. Consequently, the user should handle such errors themselves by applying platform-specific ioctls on the device descriptor and/or parsing the stream's byte-stuffing. This commit also deprecates ParityError, FramingError, and BreakConditionError. Tested on Windows and Linux with the virtual and the USB serial ports. (cherry-picked from a1655d6ccf3f82508286b471819cc5e5cb64ff44) Change-Id: I4ffc2f067787bc304a83326acb2a2421b428f986 Reviewed-by: Denis Shienkov <denis.shienkov@gmail.com>
-rw-r--r--src/serialport/qserialport.cpp22
-rw-r--r--src/serialport/qserialport.h8
-rw-r--r--src/serialport/qserialport_p.h1
-rw-r--r--src/serialport/qserialport_unix.cpp134
-rw-r--r--src/serialport/qserialport_unix_p.h2
-rw-r--r--src/serialport/qserialport_win.cpp69
-rw-r--r--src/serialport/qserialport_win_p.h4
-rw-r--r--src/serialport/qserialport_wince.cpp58
-rw-r--r--src/serialport/qserialport_wince_p.h3
9 files changed, 26 insertions, 275 deletions
diff --git a/src/serialport/qserialport.cpp b/src/serialport/qserialport.cpp
index 0973d45..2ee1308 100644
--- a/src/serialport/qserialport.cpp
+++ b/src/serialport/qserialport.cpp
@@ -81,15 +81,6 @@ QSerialPortErrorInfo::QSerialPortErrorInfo(QSerialPort::SerialPortError newError
case QSerialPort::TimeoutError:
errorString = QSerialPort::tr("Operation timed out");
break;
- case QSerialPort::ParityError:
- errorString = QSerialPort::tr("Parity error detected while reading");
- break;
- case QSerialPort::BreakConditionError:
- errorString = QSerialPort::tr("Break condition detected while reading");
- break;
- case QSerialPort::FramingError:
- errorString = QSerialPort::tr("Framing error detected while reading");
- break;
case QSerialPort::ReadError:
errorString = QSerialPort::tr("Error reading from device");
break;
@@ -118,7 +109,6 @@ QSerialPortPrivateData::QSerialPortPrivateData(QSerialPort *q)
, parity(QSerialPort::NoParity)
, stopBits(QSerialPort::OneStop)
, flowControl(QSerialPort::NoFlowControl)
- , policy(QSerialPort::IgnorePolicy)
#ifdef QT_DEPRECATED
, settingsRestoredOnClose(true)
#endif
@@ -409,13 +399,16 @@ void QSerialPortPrivate::setError(const QSerialPortErrorInfo &errorInfo)
QtSerialPort 5.2.
\value ParityError Parity error detected by the hardware while
- reading data.
+ reading data. This value is obsolete. We strongly
+ advise against using it in new code.
\value FramingError Framing error detected by the hardware while
- reading data.
+ reading data. This value is obsolete. We strongly
+ advise against using it in new code.
\value BreakConditionError Break condition detected by the hardware on
- the input line.
+ the input line. This value is obsolete. We strongly
+ advise against using it in new code.
\value WriteError An I/O error occurred while writing the data.
@@ -1141,8 +1134,7 @@ bool QSerialPort::setDataErrorPolicy(DataErrorPolicy policy)
QSerialPort::DataErrorPolicy QSerialPort::dataErrorPolicy() const
{
- Q_D(const QSerialPort);
- return d->policy;
+ return QSerialPort::IgnorePolicy;
}
#endif // QT_DEPRECATED
/*!
diff --git a/src/serialport/qserialport.h b/src/serialport/qserialport.h
index 8597232..e6eb7c7 100644
--- a/src/serialport/qserialport.h
+++ b/src/serialport/qserialport.h
@@ -188,6 +188,14 @@ public:
NotOpenError
};
+#ifdef QT_DEPRECATED
+#if defined(_MSC_VER)
+#pragma deprecated(ParityError)
+#pragma deprecated(FramingError)
+#pragma deprecated(BreakConditionError)
+#endif
+#endif
+
explicit QSerialPort(QObject *parent = Q_NULLPTR);
explicit QSerialPort(const QString &name, QObject *parent = Q_NULLPTR);
explicit QSerialPort(const QSerialPortInfo &info, QObject *parent = Q_NULLPTR);
diff --git a/src/serialport/qserialport_p.h b/src/serialport/qserialport_p.h
index fa83eec..c51519f 100644
--- a/src/serialport/qserialport_p.h
+++ b/src/serialport/qserialport_p.h
@@ -92,7 +92,6 @@ public:
QSerialPort::Parity parity;
QSerialPort::StopBits stopBits;
QSerialPort::FlowControl flowControl;
- QSerialPort::DataErrorPolicy policy;
bool settingsRestoredOnClose;
bool isBreakEnabled;
QSerialPort * const q_ptr;
diff --git a/src/serialport/qserialport_unix.cpp b/src/serialport/qserialport_unix.cpp
index 284dc76..7c18d08 100644
--- a/src/serialport/qserialport_unix.cpp
+++ b/src/serialport/qserialport_unix.cpp
@@ -731,50 +731,13 @@ bool QSerialPortPrivate::setFlowControl(QSerialPort::FlowControl flowControl)
return setTermios(&tio);
}
-bool QSerialPortPrivate::setDataErrorPolicy(QSerialPort::DataErrorPolicy policy)
-{
- termios tio;
- if (!getTermios(&tio))
- return false;
-
- tcflag_t parmrkMask = PARMRK;
-#ifndef CMSPAR
- // in space/mark parity emulation also used PARMRK flag
- if (parity == QSerialPort::SpaceParity
- || parity == QSerialPort::MarkParity) {
- parmrkMask = 0;
- }
-#endif //CMSPAR
- switch (policy) {
- case QSerialPort::SkipPolicy:
- tio.c_iflag &= ~parmrkMask;
- tio.c_iflag |= IGNPAR | INPCK;
- break;
- case QSerialPort::PassZeroPolicy:
- tio.c_iflag &= ~(IGNPAR | parmrkMask);
- tio.c_iflag |= INPCK;
- break;
- case QSerialPort::IgnorePolicy:
- tio.c_iflag &= ~INPCK;
- break;
- case QSerialPort::StopReceivingPolicy:
- tio.c_iflag &= ~IGNPAR;
- tio.c_iflag |= parmrkMask | INPCK;
- break;
- default:
- tio.c_iflag &= ~INPCK;
- break;
- }
- return setTermios(&tio);
-}
-
bool QSerialPortPrivate::readNotification()
{
Q_Q(QSerialPort);
// Always buffered, read data from the port into the read buffer
qint64 newBytes = readBuffer.size();
- qint64 bytesToRead = policy == QSerialPort::IgnorePolicy ? ReadChunkSize : 1;
+ qint64 bytesToRead = ReadChunkSize;
if (readBufferMaxSize && bytesToRead > (readBufferMaxSize - readBuffer.size())) {
bytesToRead = readBufferMaxSize - readBuffer.size();
@@ -1066,20 +1029,7 @@ bool QSerialPortPrivate::waitForReadOrWrite(bool *selectForRead, bool *selectFor
qint64 QSerialPortPrivate::readFromPort(char *data, qint64 maxSize)
{
- qint64 bytesRead = 0;
-#if defined (CMSPAR)
- if (parity == QSerialPort::NoParity
- || policy != QSerialPort::StopReceivingPolicy) {
-#else
- if (parity != QSerialPort::MarkParity
- && parity != QSerialPort::SpaceParity) {
-#endif
- bytesRead = qt_safe_read(descriptor, data, maxSize);
- } else {// Perform parity emulation.
- bytesRead = readPerChar(data, maxSize);
- }
-
- return bytesRead;
+ return qt_safe_read(descriptor, data, maxSize);
}
qint64 QSerialPortPrivate::writeToPort(const char *data, qint64 maxSize)
@@ -1099,6 +1049,8 @@ qint64 QSerialPortPrivate::writeToPort(const char *data, qint64 maxSize)
return bytesWritten;
}
+#ifndef CMSPAR
+
static inline bool evenParity(quint8 c)
{
c ^= c >> 4; //(c7 ^ c3)(c6 ^ c2)(c5 ^ c1)(c4 ^ c0)
@@ -1107,8 +1059,6 @@ static inline bool evenParity(quint8 c)
return c & 1; //(c7 ^ c3)(c5 ^ c1)(c6 ^ c2)(c4 ^ c0)
}
-#ifndef CMSPAR
-
qint64 QSerialPortPrivate::writePerChar(const char *data, qint64 maxSize)
{
termios tio;
@@ -1144,82 +1094,6 @@ qint64 QSerialPortPrivate::writePerChar(const char *data, qint64 maxSize)
#endif //CMSPAR
-qint64 QSerialPortPrivate::readPerChar(char *data, qint64 maxSize)
-{
- termios tio;
- if (!getTermios(&tio))
- return -1;
-
- qint64 ret = 0;
- quint8 const charMask = (0xFF >> (8 - dataBits));
-
- // 0 - prefix not started,
- // 1 - received 0xFF,
- // 2 - received 0xFF and 0x00
- int prefix = 0;
- while (ret < maxSize) {
-
- qint64 r = qt_safe_read(descriptor, data, 1);
- if (r < 0) {
- if (errno == EAGAIN) // It is ok for nonblocking mode.
- break;
- return -1;
- }
- if (r == 0)
- break;
-
- bool par = true;
- switch (prefix) {
- case 2: // Previously received both 0377 and 0.
- par = false;
- prefix = 0;
- break;
- case 1: // Previously received 0377.
- if (*data == '\0') {
- ++prefix;
- continue;
- }
- prefix = 0;
- break;
- default:
- if (*data == '\377') {
- prefix = 1;
- continue;
- }
- break;
- }
- // Now: par contains parity ok or error, *data contains received character
- par ^= evenParity(*data & charMask); //par contains parity bit value for EVEN mode
- par ^= (tio.c_cflag & PARODD); //par contains parity bit value for current mode
- if (par ^ (parity == QSerialPort::SpaceParity)) { //if parity error
- switch (policy) {
- case QSerialPort::SkipPolicy:
- continue; //ignore received character
- case QSerialPort::StopReceivingPolicy: {
- if (parity != QSerialPort::NoParity)
- setError(QSerialPortErrorInfo(QSerialPort::ParityError));
- else if (*data == '\0')
- setError(QSerialPortErrorInfo(QSerialPort::BreakConditionError));
- else
- setError(QSerialPortErrorInfo(QSerialPort::FramingError));
- return ++ret; //abort receiving
- }
- break;
- case QSerialPort::UnknownPolicy:
- // Unknown error policy is used! Falling back to PassZeroPolicy
- case QSerialPort::PassZeroPolicy:
- *data = '\0'; //replace received character by zero
- break;
- case QSerialPort::IgnorePolicy:
- break; //ignore error and pass received character
- }
- }
- ++data;
- ++ret;
- }
- return ret;
-}
-
typedef QMap<qint32, qint32> BaudRateMap;
// The OS specific defines can be found in termios.h
diff --git a/src/serialport/qserialport_unix_p.h b/src/serialport/qserialport_unix_p.h
index ad74b17..0e9f3ba 100644
--- a/src/serialport/qserialport_unix_p.h
+++ b/src/serialport/qserialport_unix_p.h
@@ -131,7 +131,6 @@ public:
bool setParity(QSerialPort::Parity parity);
bool setStopBits(QSerialPort::StopBits stopBits);
bool setFlowControl(QSerialPort::FlowControl flowControl);
- bool setDataErrorPolicy(QSerialPort::DataErrorPolicy policy);
void setError(const QSerialPortErrorInfo &errorInfo);
@@ -184,7 +183,6 @@ private:
#ifndef CMSPAR
qint64 writePerChar(const char *data, qint64 maxSize);
#endif
- qint64 readPerChar(char *data, qint64 maxSize);
};
diff --git a/src/serialport/qserialport_win.cpp b/src/serialport/qserialport_win.cpp
index a88ab69..d0a20ac 100644
--- a/src/serialport/qserialport_win.cpp
+++ b/src/serialport/qserialport_win.cpp
@@ -94,7 +94,6 @@ static void initializeOverlappedStructure(OVERLAPPED &overlapped)
QSerialPortPrivate::QSerialPortPrivate(QSerialPort *q)
: QSerialPortPrivateData(q)
, handle(INVALID_HANDLE_VALUE)
- , parityErrorOccurred(false)
, readChunkBuffer(ReadChunkSize, 0)
, writeStarted(false)
, readStarted(false)
@@ -124,7 +123,7 @@ QSerialPortPrivate::~QSerialPortPrivate()
bool QSerialPortPrivate::open(QIODevice::OpenMode mode)
{
DWORD desiredAccess = 0;
- originalEventMask = EV_ERR;
+ originalEventMask = 0;
if (mode & QIODevice::ReadOnly) {
desiredAccess |= GENERIC_READ;
@@ -180,8 +179,6 @@ void QSerialPortPrivate::close()
writeBuffer.clear();
actualBytesToWrite = 0;
- parityErrorOccurred = false;
-
if (settingsRestoredOnClose) {
if (!::SetCommState(handle, &restoredDcb))
setError(getSystemError());
@@ -510,18 +507,10 @@ bool QSerialPortPrivate::setFlowControl(QSerialPort::FlowControl flowControl)
return setDcb(&dcb);
}
-bool QSerialPortPrivate::setDataErrorPolicy(QSerialPort::DataErrorPolicy policy)
-{
- policy = policy;
- return true;
-}
-
bool QSerialPortPrivate::_q_completeAsyncCommunication()
{
if (overlappedResult(communicationOverlapped) == qint64(-1))
return false;
- if (EV_ERR & triggeredEventMask)
- handleLineStatusErrors();
return startAsyncRead();
}
@@ -539,12 +528,12 @@ bool QSerialPortPrivate::_q_completeAsyncRead()
readStarted = false;
bool result = true;
- if ((bytesTransferred == ReadChunkSize) && (policy == QSerialPort::IgnorePolicy))
+ if (bytesTransferred == ReadChunkSize)
result = startAsyncRead();
else if (readBufferMaxSize == 0 || readBufferMaxSize > readBuffer.size())
result = startAsyncCommunication();
- if ((bytesTransferred > 0) && !emulateErrorPolicy())
+ if (bytesTransferred > 0)
emitReadyRead();
return result;
@@ -592,7 +581,7 @@ bool QSerialPortPrivate::startAsyncRead()
if (readStarted)
return true;
- DWORD bytesToRead = policy == QSerialPort::IgnorePolicy ? ReadChunkSize : 1;
+ DWORD bytesToRead = ReadChunkSize;
if (readBufferMaxSize && bytesToRead > (readBufferMaxSize - readBuffer.size())) {
bytesToRead = readBufferMaxSize - readBuffer.size();
@@ -655,34 +644,6 @@ bool QSerialPortPrivate::_q_startAsyncWrite()
return true;
}
-bool QSerialPortPrivate::emulateErrorPolicy()
-{
- if (!parityErrorOccurred)
- return false;
-
- parityErrorOccurred = false;
-
- switch (policy) {
- case QSerialPort::SkipPolicy:
- readBuffer.getChar();
- break;
- case QSerialPort::PassZeroPolicy:
- readBuffer.getChar();
- readBuffer.putChar('\0');
- emitReadyRead();
- break;
- case QSerialPort::IgnorePolicy:
- return false;
- case QSerialPort::StopReceivingPolicy:
- emitReadyRead();
- break;
- default:
- return false;
- }
-
- return true;
-}
-
void QSerialPortPrivate::emitReadyRead()
{
Q_Q(QSerialPort);
@@ -708,26 +669,6 @@ qint64 QSerialPortPrivate::writeData(const char *data, qint64 maxSize)
return maxSize;
}
-void QSerialPortPrivate::handleLineStatusErrors()
-{
- DWORD errors = 0;
- if (!::ClearCommError(handle, &errors, Q_NULLPTR)) {
- setError(getSystemError());
- return;
- }
-
- if (errors & CE_FRAME) {
- setError(QSerialPortErrorInfo(QSerialPort::FramingError));
- } else if (errors & CE_RXPARITY) {
- setError(QSerialPortErrorInfo(QSerialPort::ParityError));
- parityErrorOccurred = true;
- } else if (errors & CE_BREAK) {
- setError(QSerialPortErrorInfo(QSerialPort::BreakConditionError));
- } else {
- setError(QSerialPortErrorInfo(QSerialPort::UnknownError, QSerialPort::tr("Unknown streaming error")));
- }
-}
-
inline bool QSerialPortPrivate::initialize()
{
DCB dcb;
@@ -767,7 +708,7 @@ inline bool QSerialPortPrivate::initialize()
return false;
}
- if (!startAsyncCommunication())
+ if ((originalEventMask & EV_RXCHAR) && !startAsyncCommunication())
return false;
return true;
diff --git a/src/serialport/qserialport_win_p.h b/src/serialport/qserialport_win_p.h
index 535bb79..c24b344 100644
--- a/src/serialport/qserialport_win_p.h
+++ b/src/serialport/qserialport_win_p.h
@@ -98,11 +98,9 @@ public:
bool setParity(QSerialPort::Parity parity);
bool setStopBits(QSerialPort::StopBits stopBits);
bool setFlowControl(QSerialPort::FlowControl flowControl);
- bool setDataErrorPolicy(QSerialPort::DataErrorPolicy policy);
void setError(const QSerialPortErrorInfo &errorInfo);
- void handleLineStatusErrors();
QSerialPortErrorInfo getSystemError(int systemErrorCode = -1) const;
bool _q_completeAsyncCommunication();
@@ -113,7 +111,6 @@ public:
bool startAsyncRead();
bool _q_startAsyncWrite();
- bool emulateErrorPolicy();
void emitReadyRead();
bool setCommunicationNotificationEnabled(bool enable);
@@ -131,7 +128,6 @@ public:
COMMTIMEOUTS currentCommTimeouts;
COMMTIMEOUTS restoredCommTimeouts;
HANDLE handle;
- bool parityErrorOccurred;
QByteArray readChunkBuffer;
bool writeStarted;
bool readStarted;
diff --git a/src/serialport/qserialport_wince.cpp b/src/serialport/qserialport_wince.cpp
index 530873b..65613aa 100644
--- a/src/serialport/qserialport_wince.cpp
+++ b/src/serialport/qserialport_wince.cpp
@@ -127,8 +127,6 @@ private slots:
error = true;
}
- if (error || (EV_ERR & eventMask))
- dptr->processIoErrors(error);
if (EV_RXCHAR & eventMask)
dptr->notifyRead();
if (EV_TXEMPTY & eventMask)
@@ -195,7 +193,7 @@ QSerialPortPrivate::QSerialPortPrivate(QSerialPort *q)
bool QSerialPortPrivate::open(QIODevice::OpenMode mode)
{
DWORD desiredAccess = 0;
- DWORD eventMask = EV_ERR;
+ DWORD eventMask = 0;
if (mode & QIODevice::ReadOnly) {
desiredAccess |= GENERIC_READ;
@@ -484,17 +482,11 @@ bool QSerialPortPrivate::setFlowControl(QSerialPort::FlowControl flowControl)
return updateDcb();
}
-bool QSerialPortPrivate::setDataErrorPolicy(QSerialPort::DataErrorPolicy policy)
-{
- policy = policy;
- return true;
-}
-
bool QSerialPortPrivate::notifyRead()
{
Q_Q(QSerialPort);
- DWORD bytesToRead = (policy == QSerialPort::IgnorePolicy) ? ReadChunkSize : 1;
+ DWORD bytesToRead = ReadChunkSize;
if (readBufferMaxSize && bytesToRead > (readBufferMaxSize - readBuffer.size())) {
bytesToRead = readBufferMaxSize - readBuffer.size();
@@ -518,27 +510,6 @@ bool QSerialPortPrivate::notifyRead()
readBuffer.chop(bytesToRead - qMax(readBytes, DWORD(0)));
- // Process emulate policy.
- if ((policy != QSerialPort::IgnorePolicy) && parityErrorOccurred) {
-
- parityErrorOccurred = false;
-
- switch (policy) {
- case QSerialPort::SkipPolicy:
- readBuffer.getChar();
- return true;
- case QSerialPort::PassZeroPolicy:
- readBuffer.getChar();
- readBuffer.putChar('\0');
- break;
- case QSerialPort::StopReceivingPolicy:
- // FIXME: Maybe need disable read notifier?
- break;
- default:
- break;
- }
- }
-
if (readBytes > 0)
emit q->readyRead();
@@ -575,31 +546,6 @@ qint64 QSerialPortPrivate::writeData(const char *data, qint64 maxSize)
return maxSize;
}
-void QSerialPortPrivate::processIoErrors(bool hasError)
-{
- if (hasError) {
- setError(QSerialPortErrorInfo(QSerialPort::ResourceError));
- return;
- }
-
- DWORD errors = 0;
- if (!::ClearCommError(handle, &errors, Q_NULLPTR)) {
- setError(getSystemError());
- return;
- }
-
- if (errors & CE_FRAME) {
- setError(QSerialPortErrorInfo(QSerialPort::FramingError));
- } else if (errors & CE_RXPARITY) {
- setError(QSerialPortErrorInfo(QSerialPort::ParityError));
- parityErrorOccurred = true;
- } else if (errors & CE_BREAK) {
- setError(QSerialPortErrorInfo(QSerialPort::BreakConditionError));
- } else {
- setError(QSerialPortErrorInfo(QSerialPort::UnknownError, QSerialPort::tr("Unknown streaming error")));
- }
-}
-
inline bool QSerialPortPrivate::initialize(DWORD eventMask)
{
Q_Q(QSerialPort);
diff --git a/src/serialport/qserialport_wince_p.h b/src/serialport/qserialport_wince_p.h
index af9ebd4..35e28e8 100644
--- a/src/serialport/qserialport_wince_p.h
+++ b/src/serialport/qserialport_wince_p.h
@@ -96,11 +96,9 @@ public:
bool setParity(QSerialPort::Parity parity);
bool setStopBits(QSerialPort::StopBits stopBits);
bool setFlowControl(QSerialPort::FlowControl flowControl);
- bool setDataErrorPolicy(QSerialPort::DataErrorPolicy policy);
void setError(const QSerialPortErrorInfo &errorInfo);
- void processIoErrors(bool error);
QSerialPortErrorInfo getSystemError(int systemErrorCode = -1) const;
bool notifyRead();
@@ -118,7 +116,6 @@ public:
COMMTIMEOUTS currentCommTimeouts;
COMMTIMEOUTS restoredCommTimeouts;
HANDLE handle;
- bool parityErrorOccurred;
QThread *eventNotifier;
QMutex settingsChangeMutex;