Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-54834

Modbus receiving 64 or more registers error

    XMLWordPrintable

Details

    • Bug
    • Resolution: Done
    • P2: Important
    • 5.6.3
    • 5.6.1, 5.7.0
    • SerialBus: MOD Bus
    • 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*/;
      

      Attachments

        1. test-modbus.zip
          3 kB
          Konstantin Sudakov
        No reviews matched the request. Check your Options in the drop-down menu of this sections header.

        Activity

          People

            sgaist Samuel Gaist
            sudakov_k Konstantin Sudakov
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Gerrit Reviews

                There are no open Gerrit changes