summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/serialbus/qmodbuspdu.cpp21
-rw-r--r--src/serialbus/qmodbuspdu.h1
2 files changed, 20 insertions, 2 deletions
diff --git a/src/serialbus/qmodbuspdu.cpp b/src/serialbus/qmodbuspdu.cpp
index 112b73d..42548e5 100644
--- a/src/serialbus/qmodbuspdu.cpp
+++ b/src/serialbus/qmodbuspdu.cpp
@@ -128,11 +128,12 @@ static QDataStream &pduFromStream(QDataStream &stream, Type type, QModbusPdu *pd
} raii = { pdu };
QModbusPdu::FunctionCode code = QModbusPdu::FunctionCode::Invalid;
- if (stream.readRawData(reinterpret_cast<char *>(&code), sizeof(quint8)) != sizeof(quint8))
+ stream >> code;
+ if (stream.status() == QDataStream::ReadPastEnd)
return stream;
pdu->setFunctionCode(code);
- if (code == QModbusPdu::Invalid || code == QModbusPdu::UndefinedFunctionCode) // shortcut
+ if (code == QModbusPdu::Invalid) // shortcut
return stream;
constexpr const int MaxPduDataSize = 252; // in bytes
@@ -623,6 +624,22 @@ void QModbusRequest::registerDataSizeCalculator(FunctionCode fc, CalcFuncPtr cal
}
/*!
+ \internal
+
+ Reads a FunctionCode from a \a stream.
+ In stream we serialize FunctionCode as one byte, so we use a temporary char
+ variable to make the code work on both little endian and big endian systems.
+ If reading from stream fails, code will retain original value.
+*/
+QDataStream &operator>>(QDataStream &stream, QModbusPdu::FunctionCode &code)
+{
+ char buffer;
+ if (stream.readRawData(&buffer, 1) == 1)
+ code = static_cast<QModbusPdu::FunctionCode>(buffer);
+ return stream;
+}
+
+/*!
\relates QModbusRequest
Reads a \a pdu from the \a stream and returns a reference to the stream.
diff --git a/src/serialbus/qmodbuspdu.h b/src/serialbus/qmodbuspdu.h
index f299f24..2c50800 100644
--- a/src/serialbus/qmodbuspdu.h
+++ b/src/serialbus/qmodbuspdu.h
@@ -187,6 +187,7 @@ private:
};
Q_SERIALBUS_EXPORT QDebug operator<<(QDebug debug, const QModbusPdu &pdu);
Q_SERIALBUS_EXPORT QDataStream &operator<<(QDataStream &stream, const QModbusPdu &pdu);
+Q_SERIALBUS_EXPORT QDataStream &operator>>(QDataStream &stream, QModbusPdu::FunctionCode &code);
class QModbusRequest : public QModbusPdu
{