Reading data from a message
There are a few methods to get values out of a ModbusMessage, to read Modbus standard values as well as free-form data.
uint8_t getServerID();
If the message has at least 2 bytes (a Modbus message needs to have a server ID and function code as a minimum), this method will return the value of the very first, the server ID. If the message is shorter, you will be returned a 0 value.
uint8_t getFunctionCode();
This method will return the second byte of a Modbus message - the function code, according to the standard. This method will return a 0 as well, if the function code could not be read.
Error getError();
getError() will return the error code in a Modbus error response message. If the message is no error response, you will get a SUCCESS code instead.
The [] operator
You can use the well-known bracket operator with a ModbusMessage to get the nth byte of a message: uint8_t byte = msg[7]; If the message is shorter than the requested byte number, you will get a 0 instead. Opposite to its std::vector sibling, the [] operator does not extend the message length!
All contents by data/size
Again like the std::vector, a ModbusMessage provides the uint8_t *data() and uint16_t size() methods to get a const access to the internal data buffer.
Iterators
ModbusMessage has both the begin() and end() iterator functions to allow iterator looping and range for loops:
for (auto& byte : msg) {
Serial.printf("%02X ", byte);
}
Serial.println();
uint16_t get(uint16_t index, T& value);
As the add() function is able to write integral data values into a message, get() is used to read values back. The index parameter gives the starting position for the extraction of a value of the integral type T. The method returns the index value after the extraction has taken place. Example:
// Get address and word count for a READ_INPUT_REGISTER request message
uint16_t addr, words;
msg.get(2, addr);
msg.get(4, words);
uint16_t get(uint16_t index, float& value); and uint16_t get(uint16_t index, double& value);
These get() variants are to extract a 4-byte IEEE754 float or an 8-byte IEEE754 double from a message. The order of bytes in the message is assumed to be “pure IEEE754” MSB-first.
User-defined float and double byte orders
These two get() functions also support the byte-reordering optional third parameters to retrieve a float or double value in a byte order different from IEEE754. Please see the detailed description at the respective add() functions!