summaryrefslogtreecommitdiffstats
path: root/src/serialbus/qmodbuspdu.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/serialbus/qmodbuspdu.cpp')
-rw-r--r--src/serialbus/qmodbuspdu.cpp21
1 files changed, 19 insertions, 2 deletions
diff --git a/src/serialbus/qmodbuspdu.cpp b/src/serialbus/qmodbuspdu.cpp
index d97d614..e23fa7b 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.