- Qt 6.8
- Qt Serial Bus
- C++ Classes
- QModbusResponse
- Qt 6.8.3 Reference Documentation

# QModbusResponse Class

QModbusResponse is a container class containing the function code and payload that is stored inside a Modbus ADU. More...

Header: | `#include <QModbusResponse>`
CMake: | `find_package(Qt6 REQUIRED COMPONENTS SerialBus)` `target_link_libraries(mytarget PRIVATE Qt6::SerialBus)`
qmake: | `QT += serialbus`
Inherits: | QModbusPdu
Inherited By: | QModbusExceptionResponse

- List of all members, including inherited members

## Public Types

| CalcFuncPtr

## Public Functions

| QModbusResponse()
| QModbusResponse(const QModbusPdu &pdu)
| QModbusResponse(QModbusPdu::FunctionCode code, Args... data)
| QModbusResponse(QModbusPdu::FunctionCode code, const QByteArray &data = QByteArray())

## Static Public Members

int | calculateDataSize(const QModbusResponse &response)
int | minimumDataSize(const QModbusResponse &response)
void | registerDataSizeCalculator(QModbusPdu::FunctionCode fc, QModbusResponse::CalcFuncPtr calculator)

## Related Non-Members

QDataStream & | operator>>(QDataStream &stream, QModbusResponse &pdu)

## Detailed Description

A typical Modbus response can looks like this:

     QModbusResponse response(QModbusResponse::ReadCoils, QByteArray::fromHex("02cd01"));

Note: When using the constructor taking the `QByteArray`, please make sure to convert the containing data to big-endian byte order before creating the request.

The same response can be created like this, if the values are known at compile time:

     quint8 payloadInBytes = 2, outputHigh = 0xcd, outputLow = 0x01;
     QModbusResponse response(QModbusResponse::ReadCoils, payloadInBytes, outputHigh, outputLow);

## Member Type Documentation

### `[alias]` QModbusResponse::CalcFuncPtr

Typedef for a pointer to a custom calculator function with the same signature as QModbusResponse::calculateDataSize.

## Member Function Documentation

### `[constexpr noexcept]` QModbusResponse::QModbusResponse()

Constructs an invalid QModbusResponse.

### QModbusResponse::QModbusResponse(const QModbusPdu &pdu)

Constructs a copy of pdu.

### template <typename... Args> QModbusResponse::QModbusResponse(QModbusPdu::FunctionCode code, Args... data)

Constructs a QModbusResponse with function code set to code and payload set to data. The data is converted and stored in big-endian byte order.

Note: Usage is limited `quint8` and `quint16` only. This is because `QDataStream` stream operators will not only append raw data, but also e.g. size, count, etc. for complex types.

### `[explicit]` QModbusResponse::QModbusResponse(QModbusPdu::FunctionCode code, const QByteArray &data = QByteArray())

Constructs a QModbusResponse with function code set to code and payload set to data. The data is expected to be stored in big-endian byte order already.

### `[static]` int QModbusResponse::calculateDataSize(const QModbusResponse &response)

Calculates the expected data size for response, based on the response's function code and data. Returns the full size of the response's data part; `-1` if the size could not be properly calculated.

See also minimumDataSize and registerDataSizeCalculator.

### `[static]` int QModbusResponse::minimumDataSize(const QModbusResponse &response)

Returns the expected minimum data size for response based on the response's function code; `-1` if the function code is not known.

### `[static]` void QModbusResponse::registerDataSizeCalculator(QModbusPdu::FunctionCode fc, QModbusResponse::CalcFuncPtr calculator)

This function registers a user-defined implementation to calculate the response data size for function code fc. It can be used to extend or override the implementation inside QModbusResponse::calculateDataSize().

The `CalcFuncPtr` is a typedef for a pointer to a custom calculator function with the following signature:

     int myCalculateDataSize(const QModbusResponse &pdu);

## Related Non-Members

### QDataStream &operator>>(QDataStream &stream, QModbusResponse &pdu)

Reads a pdu from the stream and returns a reference to the stream.

Note: The function might fail to properly stream PDU's with function code QModbusPdu::Diagnostics or QModbusPdu::EncapsulatedInterfaceTransport because of the missing size indicator inside the PDU. In particular this may happen when the PDU is embedded into a stream that doesn't end with the diagnostic/encapsulated request itself.