summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/plugins/canbus/peakcan/main.cpp2
-rw-r--r--src/plugins/canbus/tinycan/main.cpp2
-rw-r--r--src/serialbus/qcanbusframe.h4
-rw-r--r--src/serialbus/qmodbuspdu.cpp8
-rw-r--r--src/serialbus/qmodbuspdu.h4
-rw-r--r--src/serialbus/qmodbusrtuserialmaster.cpp7
-rw-r--r--src/serialbus/qmodbusrtuserialmaster_p.h5
-rw-r--r--sync.profile5
-rw-r--r--tests/auto/qmodbuspdu/tst_qmodbuspdu.cpp19
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)