Pārlūkot izejas kodu

Merge branch 'bugfix/freemodbus_fix_zero_based_reg_address_in_iterator_v43' into 'release/v4.3'

freemodbus: fix mb zero based reg address in the iterator (backport v4.3)

See merge request espressif/esp-idf!14551
Alex Lisitsyn 4 gadi atpakaļ
vecāks
revīzija
3a9a208edc

+ 1 - 1
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;
         }

+ 2 - 2
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;