From 0d3f19beeac82044f58f0c58d7855f8d8e7554c1 Mon Sep 17 00:00:00 2001 From: aleks Date: Fri, 19 Feb 2021 15:39:08 +0100 Subject: [PATCH] freemodbus: fix mb zero based reg address in the iterator Fixes https://github.com/espressif/esp-idf/issues/6571 --- components/freemodbus/common/esp_modbus_slave.c | 2 +- examples/protocols/modbus/serial/mb_slave/main/slave.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/components/freemodbus/common/esp_modbus_slave.c b/components/freemodbus/common/esp_modbus_slave.c index a5b055860f..f69599c04a 100644 --- a/components/freemodbus/common/esp_modbus_slave.c +++ b/components/freemodbus/common/esp_modbus_slave.c @@ -62,7 +62,7 @@ static mb_descr_entry_t* mbc_slave_find_reg_descriptor(mb_param_type_t type, uin if ((addr >= it->start_offset) && (it->p_data) && (regs >= 1) - && ((addr + regs) <= (it->start_offset + reg_size + 1)) + && ((addr + regs) <= (it->start_offset + reg_size)) && (reg_size >= 1)) { return it; } diff --git a/examples/protocols/modbus/serial/mb_slave/main/slave.c b/examples/protocols/modbus/serial/mb_slave/main/slave.c index 0c0372bbe1..30f3a38580 100644 --- a/examples/protocols/modbus/serial/mb_slave/main/slave.c +++ b/examples/protocols/modbus/serial/mb_slave/main/slave.c @@ -118,7 +118,8 @@ void app_main(void) reg_area.type = MB_PARAM_HOLDING; // Set type of register area reg_area.start_offset = MB_REG_HOLDING_START_AREA0; // Offset of register area in Modbus protocol reg_area.address = (void*)&holding_reg_params.holding_data0; // Set pointer to storage instance - reg_area.size = sizeof(float) << 2; // Set the size of register storage instance + // Set the size of register storage instance = 150 holding registers + reg_area.size = (size_t)(HOLD_OFFSET(holding_data4) - HOLD_OFFSET(test_regs)); ESP_ERROR_CHECK(mbc_slave_set_descriptor(reg_area)); reg_area.type = MB_PARAM_HOLDING; // Set type of register area reg_area.start_offset = MB_REG_HOLDING_START_AREA1; // Offset of register area in Modbus protocol @@ -132,7 +133,6 @@ void app_main(void) reg_area.address = (void*)&input_reg_params.input_data0; reg_area.size = sizeof(float) << 2; ESP_ERROR_CHECK(mbc_slave_set_descriptor(reg_area)); - // Initialization of Input Registers area reg_area.type = MB_PARAM_INPUT; reg_area.start_offset = MB_REG_INPUT_START_AREA1; reg_area.address = (void*)&input_reg_params.input_data4;