From 1683fc48e1ee63c9e5687bcdf55d45bcafe8e6f8 Mon Sep 17 00:00:00 2001 From: Samuel Gaist Date: Fri, 4 Nov 2016 00:36:53 +0100 Subject: Fix handling of byte count fields MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- src/serialbus/qmodbuspdu.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src') 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) { -- cgit v1.2.3