Hello Nordic Team ,
I am working on Nrf connect sdk v2.9.0 in this i m getting issue in Modbus RTU server [Slave] can you check my conf and code
To check my code i use Q MODMASTER software Tool to give request my device which is Slave but it did not go the Holding reg call back
I Check with Logic analyzer but the pin of DE is not drive Could you help me
Prj conf
CONFIG_UART_CONSOLE=n CONFIG_UART_USE_RUNTIME_CONFIGURE=y #CONFIG_SYSTEM_WORKQUEUE=y CONFIG_PM=y CONFIG_SERIAL=y CONFIG_MODBUS=y CONFIG_MODBUS_SERIAL=y CONFIG_MODBUS_ROLE_SERVER=y
Code
/* ─────────────────────────────────────────────
* Modbus RTU Server (RS485)
* ───────────────────────────────────────────── */
#include <zephyr/modbus/modbus.h>
static int holding_reg_rd(uint16_t addr, uint16_t *reg)
{
if (addr == 0) {
*reg = ((uint16_t)chock_char_data[0] << 8) | chock_char_data[1];
return 0;
}
return -ENOTSUP;
}
static struct modbus_user_callbacks mbc = {
.holding_reg_rd = holding_reg_rd,
};
static int modbus_server_init(void)
{
/* Configure DE pin as output, start LOW (receive mode) */
/*int err = gpio_pin_configure(gpio0_dev, MODBUS_DE_PIN,
GPIO_OUTPUT_INACTIVE);
if (err) {
LOG_ERR("Failed to configure Modbus DE pin (err %d)", err);
return err;
}*/
int err ;
const struct modbus_iface_param server_param = {
.mode = MODBUS_MODE_RTU,
.server = {
.user_cb = &mbc,
.unit_id = 1,
},
.serial = {
.baud = 9600,
.parity = UART_CFG_PARITY_NONE,
.stop_bits_client = UART_CFG_STOP_BITS_1,
// .de = modbus_de_set, /* SW-controlled DE pin */
},
};
int iface = modbus_iface_get_by_name("modbus0");
if (iface < 0) {
LOG_ERR("Modbus interface not found (err %d)", iface);
return iface;
}
err = modbus_init_server(iface, server_param);
if (err) {
LOG_ERR("modbus_init_server failed (err %d)", err);
} else {
LOG_INF("Modbus RTU server initialized (unit_id=1)");
}
return err;
}
Overlay
/*
* UART0 — Modbus RTU over RS-485
*
* The child node 'modbus0' uses the zephyr,modbus-serial compatible.
* The driver automatically toggles DE/RE at the right time:
* - DE (P0.11): asserted HIGH before TX, de-asserted after last byte sent
* - RE (P0.12): active-low, asserted (LOW) during RX, de-asserted during TX
*/
&uart0 {
status = "okay";
current-speed = <9600>;
modbus0: modbus0 {
compatible = "zephyr,modbus-serial";
status = "okay";
de-gpios = <&gpio0 17 GPIO_ACTIVE_HIGH>;
re-gpios = <&gpio0 19 GPIO_ACTIVE_LOW>;
};
};