Details
-
Bug
-
Resolution: Done
-
P2: Important
-
5.6.1, 5.7.0
-
None
-
OS: Ubuntu 15.10, Windows 7.
Qt: 5.7.0, opensource.
-
1683fc48e1ee63c9e5687bcdf55d45bcafe8e6f8
Description
Problem in file qmodbuspdu.cpp, QModbusResponse::calculateDataSize.
case QModbusResponse::ReadCoils: case QModbusResponse::ReadDiscreteInputs: case QModbusResponse::ReadHoldingRegisters: case QModbusResponse::ReadInputRegisters: case QModbusResponse::GetCommEventLog: case QModbusResponse::ReadFileRecord: case QModbusResponse::WriteFileRecord: case QModbusResponse::ReadWriteMultipleRegisters: case QModbusResponse::ReportServerId: if (response.dataSize() >= 1) size = 1 /*byte count*/ + response.data()[0] /*actual bytes*/; break;
64 registers is 128 bytes, but response.data() is QByteArray. QByteArray use (signed) char. Modbus use unsigned char for data size. 128 (unsigned char) == -128 (signed char, cast to int). Size calculation is incorrect.
Solution variant:
size = 1 /*byte count*/ + static_cast<quint8>(response.data()[0]) /*actual bytes*/;