diff options
author | Samuel Gaist <samuel.gaist@edeltech.ch> | 2016-11-04 00:36:53 +0100 |
---|---|---|
committer | Samuel Gaist <samuel.gaist@edeltech.ch> | 2016-11-04 18:47:28 +0000 |
commit | 1683fc48e1ee63c9e5687bcdf55d45bcafe8e6f8 (patch) | |
tree | 5248e9fd1ebbcea4e32ffca3e21ae5db25948a99 | |
parent | 0d31e8cd10d09fd2b28052c89a4f96c32c104848 (diff) |
Fix handling of byte count fields
The various byte count fields are all unsigned byte however the incoming
data are loaded in a QByteArray which returns signed char. This patch
fixes this by converting the field value to quint8.
[ChangeLog][Modbus] Fixed handling of packets with payloads longer than
127 bytes.
Task-number: QTBUG-54834
Change-Id: I699c4cf0cea9933bef6c040c573d2d6e6a113920
Reviewed-by: André Hartmann <aha_1980@gmx.de>
-rw-r--r-- | src/serialbus/qmodbuspdu.cpp | 8 | ||||
-rw-r--r-- | tests/auto/qmodbuspdu/tst_qmodbuspdu.cpp | 19 |
2 files changed, 23 insertions, 4 deletions
diff --git a/src/serialbus/qmodbuspdu.cpp b/src/serialbus/qmodbuspdu.cpp index 1615c48..cdba047 100644 --- a/src/serialbus/qmodbuspdu.cpp +++ b/src/serialbus/qmodbuspdu.cpp @@ -540,18 +540,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) @@ -671,7 +671,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/tests/auto/qmodbuspdu/tst_qmodbuspdu.cpp b/tests/auto/qmodbuspdu/tst_qmodbuspdu.cpp index 76bfea3..9c74a6c 100644 --- a/tests/auto/qmodbuspdu/tst_qmodbuspdu.cpp +++ b/tests/auto/qmodbuspdu/tst_qmodbuspdu.cpp @@ -803,6 +803,25 @@ private slots: quint8(0xff)); // dummy additional data QCOMPARE(QModbusResponse::calculateDataSize(rdi), 22); } + + 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) |