diff --git a/include/modbus/modbus_rtu.h b/include/modbus/modbus_rtu.h index cbe1136d873..6eb24da98d5 100644 --- a/include/modbus/modbus_rtu.h +++ b/include/modbus/modbus_rtu.h @@ -334,6 +334,18 @@ struct mbs_rtu_user_callbacks { int (*holding_reg_wr_fp)(uint16_t addr, float reg); }; +/** + * @brief Get Modbus RTU interface index according to interface name + * + * If there is more than one interface, it can be used to clearly + * identify interfaces in the application. + * + * @param iface_name Modbus RTU interface name + * + * @retval Modbus RTU interface index or negative error value. + */ +int mb_rtu_iface_get_by_name(const char *iface_name); + /** * @brief Configure Modbus Interface as server * diff --git a/samples/subsys/modbus/rtu_client/app.overlay b/samples/subsys/modbus/rtu_client/app.overlay index 124708a18c3..39f4489fc23 100644 --- a/samples/subsys/modbus/rtu_client/app.overlay +++ b/samples/subsys/modbus/rtu_client/app.overlay @@ -9,7 +9,7 @@ modbus0 { compatible = "zephyr,modbus-serial"; - label = "MODBUS"; + label = "MODBUS0"; status = "okay"; de-gpios = <&arduino_header 15 GPIO_ACTIVE_LOW>; /* D9 */ }; diff --git a/samples/subsys/modbus/rtu_server/app.overlay b/samples/subsys/modbus/rtu_server/app.overlay index 124708a18c3..39f4489fc23 100644 --- a/samples/subsys/modbus/rtu_server/app.overlay +++ b/samples/subsys/modbus/rtu_server/app.overlay @@ -9,7 +9,7 @@ modbus0 { compatible = "zephyr,modbus-serial"; - label = "MODBUS"; + label = "MODBUS0"; status = "okay"; de-gpios = <&arduino_header 15 GPIO_ACTIVE_LOW>; /* D9 */ }; diff --git a/samples/subsys/modbus/rtu_server/src/main.c b/samples/subsys/modbus/rtu_server/src/main.c index 2e9052eaf3c..f746d088e26 100644 --- a/samples/subsys/modbus/rtu_server/src/main.c +++ b/samples/subsys/modbus/rtu_server/src/main.c @@ -102,8 +102,16 @@ static struct mbs_rtu_user_callbacks mbs_cbs = { static int init_modbus_server(void) { - const uint8_t iface = 0; const uint32_t mb_rtu_br = 19200; + const char iface_name[] = {DT_PROP(DT_INST(0, zephyr_modbus_serial), label)}; + int iface; + + iface = mb_rtu_iface_get_by_name(iface_name); + + if (iface < 0) { + LOG_ERR("Failed to get iface index for %s", iface_name); + return iface; + } return mb_rtu_cfg_server(iface, 1, mb_rtu_br, UART_CFG_PARITY_NONE, &mbs_cbs, false); diff --git a/subsys/modbus/mb_rtu_core.c b/subsys/modbus/mb_rtu_core.c index 1c21da7d1a8..0339b4f2fbb 100644 --- a/subsys/modbus/mb_rtu_core.c +++ b/subsys/modbus/mb_rtu_core.c @@ -49,6 +49,7 @@ DT_INST_FOREACH_STATUS_OKAY(MB_RTU_DEFINE_GPIO_CFGS) (&d##_cfg_##n), (NULL)) #define MODBUS_DT_GET_DEV(n) { \ + .iface_name = DT_INST_LABEL(n), \ .dev_name = DT_INST_BUS_LABEL(n), \ .de = MB_RTU_ASSIGN_GPIO_CFG(n, de_gpios), \ .re = MB_RTU_ASSIGN_GPIO_CFG(n, re_gpios), \ @@ -663,6 +664,7 @@ static struct mb_rtu_context *mb_cfg_iface(const uint8_t iface, k_timer_init(&ctx->rtu_timer, mb_rtu_tmr_handler, NULL); k_timer_user_data_set(&ctx->rtu_timer, ctx); + LOG_DBG("Modbus interface %s initialized", ctx->iface_name); return ctx; } @@ -696,6 +698,17 @@ int mb_rtu_cfg_server(const uint8_t iface, const uint8_t node_addr, return 0; } +int mb_rtu_iface_get_by_name(const char *iface_name) +{ + for (int i = 0; i < ARRAY_SIZE(mb_ctx_tbl); i++) { + if (strcmp(iface_name, mb_ctx_tbl[i].iface_name) == 0) { + return i; + } + } + + return -ENODEV; +} + int mb_rtu_cfg_client(const uint8_t iface, const uint32_t baud, const enum uart_config_parity parity, const uint32_t rx_timeout, diff --git a/subsys/modbus/mb_rtu_internal.h b/subsys/modbus/mb_rtu_internal.h index 4d65c0e97dc..834b74676b0 100644 --- a/subsys/modbus/mb_rtu_internal.h +++ b/subsys/modbus/mb_rtu_internal.h @@ -89,6 +89,8 @@ struct mb_rtu_gpio_config { #define MB_RTU_STATE_CONFIGURED 0 struct mb_rtu_context { + /* Interface name */ + const char *iface_name; /* UART device name */ const char *dev_name; /* UART device */ diff --git a/tests/subsys/modbus_rtu/boards/frdm_k64f.overlay b/tests/subsys/modbus_rtu/boards/frdm_k64f.overlay index 581336fe344..e439d4cee07 100644 --- a/tests/subsys/modbus_rtu/boards/frdm_k64f.overlay +++ b/tests/subsys/modbus_rtu/boards/frdm_k64f.overlay @@ -9,7 +9,7 @@ modbus0 { compatible = "zephyr,modbus-serial"; - label = "MODBUS"; + label = "MODBUS0"; status = "okay"; de-gpios = <&gpiob 22 GPIO_ACTIVE_LOW>; /* red LED */ re-gpios = <&gpioe 26 GPIO_ACTIVE_LOW>; /* green LED */ @@ -22,7 +22,7 @@ modbus1 { compatible = "zephyr,modbus-serial"; - label = "MODBUS"; + label = "MODBUS1"; status = "okay"; }; }; diff --git a/tests/subsys/modbus_rtu/boards/reel_board.overlay b/tests/subsys/modbus_rtu/boards/reel_board.overlay index 840434e4917..d5f6a80fae6 100644 --- a/tests/subsys/modbus_rtu/boards/reel_board.overlay +++ b/tests/subsys/modbus_rtu/boards/reel_board.overlay @@ -9,7 +9,7 @@ modbus0 { compatible = "zephyr,modbus-serial"; - label = "MODBUS"; + label = "MODBUS0"; status = "okay"; }; };