summaryrefslogtreecommitdiffstats
path: root/src/serialbus/qmodbusrtuserialmaster_p.h
diff options
context:
space:
mode:
authorKarsten Heimrich <karsten.heimrich@theqtcompany.com>2016-02-17 15:45:46 +0100
committerKarsten Heimrich <karsten.heimrich@theqtcompany.com>2016-02-18 07:56:28 +0000
commit6956e682340221be286080ec9b40d0ecf6fc882d (patch)
treefeca01841320a8c5d659b1d3ec028db3904cc2b0 /src/serialbus/qmodbusrtuserialmaster_p.h
parent08de0fdb454288dea680ec2174854cdc06bb9c7c (diff)
Special implementation for Diagnostics:ReturnQueryData msg code.
Change-Id: I1a07113ae1b6089a315862638dca8e6d4018fdd2 Reviewed-by: Alex Blasche <alexander.blasche@theqtcompany.com>
Diffstat (limited to 'src/serialbus/qmodbusrtuserialmaster_p.h')
-rw-r--r--src/serialbus/qmodbusrtuserialmaster_p.h20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/serialbus/qmodbusrtuserialmaster_p.h b/src/serialbus/qmodbusrtuserialmaster_p.h
index a570205..9517777 100644
--- a/src/serialbus/qmodbusrtuserialmaster_p.h
+++ b/src/serialbus/qmodbusrtuserialmaster_p.h
@@ -47,6 +47,7 @@
#include <private/qmodbusadu_p.h>
#include <private/qmodbusclient_p.h>
+#include <private/qmodbus_symbols_p.h>
//
// W A R N I N G
@@ -105,12 +106,29 @@ public:
}
// server address byte + function code byte + PDU size + 2 bytes CRC
- const int aduSize = 2 + pduSizeWithoutFcode + 2;
+ int aduSize = 2 + pduSizeWithoutFcode + 2;
if (tmpAdu.rawSize() < aduSize) {
qCDebug(QT_MODBUS) << "(RTU client) Incomplete ADU received, ignoring";
return;
}
+ // Special case for Diagnostics:ReturnQueryData. The response has no
+ // length indicator and is just a simple echo of what we have send.
+ if (tmpAdu.pdu().functionCode() == QModbusPdu::Diagnostics) {
+ const QModbusResponse response = tmpAdu.pdu();
+ if (canMatchRequestAndResponse(response, tmpAdu.serverAddress())) {
+ quint16 subCode = 0xffff;
+ response.decodeData(&subCode);
+ if (subCode == Diagnostics::ReturnQueryData) {
+ if (response.data() != m_current.requestPdu.data())
+ return; // echo does not match request yet
+ aduSize = 2 + response.dataSize() + 2;
+ if (tmpAdu.rawSize() < aduSize)
+ return; // echo matches, probably checksum missing
+ }
+ }
+ }
+
const QModbusSerialAdu adu(QModbusSerialAdu::Rtu, responseBuffer.left(aduSize));
responseBuffer.remove(0, aduSize);