diff options
-rw-r--r-- | src/plugins/canbus/peakcan/main.cpp | 2 | ||||
-rw-r--r-- | src/plugins/canbus/tinycan/main.cpp | 2 | ||||
-rw-r--r-- | src/serialbus/qcanbusframe.h | 4 | ||||
-rw-r--r-- | src/serialbus/qmodbuspdu.cpp | 8 | ||||
-rw-r--r-- | src/serialbus/qmodbuspdu.h | 4 | ||||
-rw-r--r-- | src/serialbus/qmodbusrtuserialmaster.cpp | 7 | ||||
-rw-r--r-- | src/serialbus/qmodbusrtuserialmaster_p.h | 5 | ||||
-rw-r--r-- | sync.profile | 5 | ||||
-rw-r--r-- | tests/auto/qmodbuspdu/tst_qmodbuspdu.cpp | 19 |
9 files changed, 40 insertions, 16 deletions
diff --git a/src/plugins/canbus/peakcan/main.cpp b/src/plugins/canbus/peakcan/main.cpp index d4886a9..00b4d36 100644 --- a/src/plugins/canbus/peakcan/main.cpp +++ b/src/plugins/canbus/peakcan/main.cpp @@ -55,7 +55,7 @@ public: { QString errorReason; if (!PeakCanBackend::canCreate(&errorReason)) { - qWarning("%s", qUtf8Printable(errorReason)); + qWarning("%ls", qUtf16Printable(errorReason)); if (errorMessage) *errorMessage = errorReason; return nullptr; diff --git a/src/plugins/canbus/tinycan/main.cpp b/src/plugins/canbus/tinycan/main.cpp index 5bce912..fe988ba 100644 --- a/src/plugins/canbus/tinycan/main.cpp +++ b/src/plugins/canbus/tinycan/main.cpp @@ -55,7 +55,7 @@ public: { QString errorReason; if (!TinyCanBackend::canCreate(&errorReason)) { - qWarning("%s", qUtf8Printable(errorReason)); + qWarning("%ls", qUtf16Printable(errorReason)); if (errorMessage) *errorMessage = errorReason; return nullptr; diff --git a/src/serialbus/qcanbusframe.h b/src/serialbus/qcanbusframe.h index 7f3a2be..486d996 100644 --- a/src/serialbus/qcanbusframe.h +++ b/src/serialbus/qcanbusframe.h @@ -77,6 +77,7 @@ public: version(0x0), isFlexibleDataRate(0x0) { + memset(reserved, 0, sizeof(reserved)); setFrameId(0x0); setFrameType(type); } @@ -106,8 +107,7 @@ public: isFlexibleDataRate(data.length() > 8 ? 0x1 : 0x0), load(data) { - Q_UNUSED(reserved); - + memset(reserved, 0, sizeof(reserved)); setFrameId(identifier); } diff --git a/src/serialbus/qmodbuspdu.cpp b/src/serialbus/qmodbuspdu.cpp index 2b01ad6..32a3b43 100644 --- a/src/serialbus/qmodbuspdu.cpp +++ b/src/serialbus/qmodbuspdu.cpp @@ -555,18 +555,18 @@ int QModbusRequest::calculateDataSize(const QModbusRequest &request) case QModbusPdu::WriteMultipleCoils: minimum -= 1; // first payload payload byte if (request.dataSize() >= minimum) - size = minimum + request.data()[minimum - 1] /*byte count*/; + size = minimum + quint8(request.data()[minimum - 1]) /*byte count*/; break; case QModbusPdu::WriteMultipleRegisters: case QModbusPdu::ReadWriteMultipleRegisters: minimum -= 2; // first 2 payload payload bytes if (request.dataSize() >= minimum) - size = minimum + request.data()[minimum - 1] /*byte count*/; + size = minimum + quint8(request.data()[minimum - 1]) /*byte count*/; break; case QModbusPdu::ReadFileRecord: case QModbusPdu::WriteFileRecord: if (request.dataSize() >= 1) - size = 1 /*byte count*/ + request.data()[0] /*actual bytes*/; + size = 1 /*byte count*/ + quint8(request.data()[0]) /*actual bytes*/; break; case QModbusPdu::EncapsulatedInterfaceTransport: { if (request.dataSize() < minimum) @@ -710,7 +710,7 @@ int QModbusResponse::calculateDataSize(const QModbusResponse &response) case QModbusResponse::ReadWriteMultipleRegisters: case QModbusResponse::ReportServerId: if (response.dataSize() >= 1) - size = 1 /*byte count*/ + response.data()[0] /*actual bytes*/; + size = 1 /*byte count*/ + quint8(response.data()[0]) /*actual bytes*/; break; case QModbusResponse::ReadFifoQueue: { if (response.dataSize() >= 2) { diff --git a/src/serialbus/qmodbuspdu.h b/src/serialbus/qmodbuspdu.h index 1255593..65a3247 100644 --- a/src/serialbus/qmodbuspdu.h +++ b/src/serialbus/qmodbuspdu.h @@ -208,6 +208,8 @@ public: {} }; Q_SERIALBUS_EXPORT QDataStream &operator>>(QDataStream &stream, QModbusRequest &pdu); +inline QDataStream &operator<<(QDataStream &stream, const QModbusRequest &pdu) +{ return stream << static_cast<const QModbusPdu &>(pdu); } class QModbusResponse : public QModbusPdu { @@ -250,6 +252,8 @@ public: void setExceptionCode(ExceptionCode ec) { QModbusPdu::encodeData(quint8(ec)); } }; Q_SERIALBUS_EXPORT QDataStream &operator>>(QDataStream &stream, QModbusResponse &pdu); +inline QDataStream &operator<<(QDataStream &stream, const QModbusResponse &pdu) +{ return stream << static_cast<const QModbusPdu &>(pdu); } Q_DECLARE_TYPEINFO(QModbusPdu, Q_MOVABLE_TYPE); Q_DECLARE_TYPEINFO(QModbusPdu::ExceptionCode, Q_PRIMITIVE_TYPE); diff --git a/src/serialbus/qmodbusrtuserialmaster.cpp b/src/serialbus/qmodbusrtuserialmaster.cpp index 331e0ee..5a9555e 100644 --- a/src/serialbus/qmodbusrtuserialmaster.cpp +++ b/src/serialbus/qmodbusrtuserialmaster.cpp @@ -144,10 +144,15 @@ bool QModbusRtuSerialMaster::open() */ void QModbusRtuSerialMaster::close() { - if (state() == QModbusDevice::UnconnectedState) + if (state() == QModbusDevice::UnconnectedState || + state() == QModbusDevice::ClosingState) { return; + } + + setState(QModbusDevice::ClosingState); Q_D(QModbusRtuSerialMaster); + if (d->m_serialPort->isOpen()) d->m_serialPort->close(); diff --git a/src/serialbus/qmodbusrtuserialmaster_p.h b/src/serialbus/qmodbusrtuserialmaster_p.h index e7e9a92..c698ebc 100644 --- a/src/serialbus/qmodbusrtuserialmaster_p.h +++ b/src/serialbus/qmodbusrtuserialmaster_p.h @@ -216,8 +216,9 @@ public: QObject::connect(m_serialPort, &QSerialPort::aboutToClose, q, [this]() { Q_Q(QModbusRtuSerialMaster); - if (q->state() != QModbusDevice::ClosingState) - q->close(); + Q_UNUSED(q); // To avoid unused variable warning in release mode + Q_ASSERT(q->state() == QModbusDevice::ClosingState); + m_sendTimer.stop(); m_responseTimer.stop(); }); diff --git a/sync.profile b/sync.profile index 57da4d8..e7125c6 100644 --- a/sync.profile +++ b/sync.profile @@ -1,8 +1,3 @@ %modules = ( "QtSerialBus" => "$basedir/src/serialbus", ); - -%dependencies = ( - "qtbase" => "", - "qtserialport" => "", -); diff --git a/tests/auto/qmodbuspdu/tst_qmodbuspdu.cpp b/tests/auto/qmodbuspdu/tst_qmodbuspdu.cpp index 592a14e..f442344 100644 --- a/tests/auto/qmodbuspdu/tst_qmodbuspdu.cpp +++ b/tests/auto/qmodbuspdu/tst_qmodbuspdu.cpp @@ -844,6 +844,25 @@ private slots: }); QCOMPARE(QModbusRequest::calculateDataSize(request), 27); } + + void testCalculateLongDataSize() + { + QByteArray longData = QByteArray(128, ' '); + longData[0] = longData.size(); + const QModbusResponse response(QModbusResponse::ReadCoils, longData); + QCOMPARE(QModbusResponse::calculateDataSize(response), 1 + longData.size()); + + const QModbusRequest wfrRequest(QModbusPdu::WriteFileRecord, longData); + QCOMPARE(QModbusRequest::calculateDataSize(wfrRequest), 1 + longData.size()); + + longData = QByteArray(4 + 128, ' '); + longData[4] = 128; + const QModbusRequest wmcRequest(QModbusPdu::WriteMultipleCoils, longData); + QCOMPARE(QModbusRequest::calculateDataSize(wmcRequest), 1 + longData.size()); + + const QModbusRequest wmrRequest(QModbusPdu::WriteMultipleRegisters, longData); + QCOMPARE(QModbusRequest::calculateDataSize(wmrRequest), 1 + longData.size()); + } }; QTEST_MAIN(tst_QModbusPdu) |