From a9690e0862d5c299a378e46ae0dd5a769e246e9e Mon Sep 17 00:00:00 2001 From: Johann Fischer Date: Mon, 28 Dec 2020 17:03:38 +0100 Subject: [PATCH] modbus: fix ASCII frame reception and add test for ASCII mode Fix ASCII frame reception and add test for ASCII mode. Signed-off-by: Johann Fischer --- subsys/modbus/mb_rtu_core.c | 4 +--- tests/subsys/modbus_rtu/prj.conf | 1 + tests/subsys/modbus_rtu/src/main.c | 9 +++++++++ tests/subsys/modbus_rtu/src/test_modbus.h | 2 ++ tests/subsys/modbus_rtu/src/test_modbus_client.c | 15 +++++++++++++++ tests/subsys/modbus_rtu/src/test_modbus_server.c | 15 +++++++++++++++ 6 files changed, 43 insertions(+), 3 deletions(-) diff --git a/subsys/modbus/mb_rtu_core.c b/subsys/modbus/mb_rtu_core.c index 0339b4f2fbb..b7656932099 100644 --- a/subsys/modbus/mb_rtu_core.c +++ b/subsys/modbus/mb_rtu_core.c @@ -134,7 +134,7 @@ static int mb_rx_ascii_frame(struct mb_rtu_context *ctx) return -EMSGSIZE; } - if (rx_size > MODBUS_ASCII_MIN_MSG_SIZE) { + if (rx_size < MODBUS_ASCII_MIN_MSG_SIZE) { LOG_WRN("Frame length error"); return -EMSGSIZE; } @@ -169,8 +169,6 @@ static int mb_rx_ascii_frame(struct mb_rtu_context *ctx) ctx->rx_frame.length++; } - /* Subtract the Address and function code */ - ctx->rx_frame.length -= 2; /* Extract the message's LRC */ hex2bin(pmsg, 2, &frame_lrc, 1); ctx->rx_frame.crc = frame_lrc; diff --git a/tests/subsys/modbus_rtu/prj.conf b/tests/subsys/modbus_rtu/prj.conf index d4f1e7fb310..a3d0b43eae9 100644 --- a/tests/subsys/modbus_rtu/prj.conf +++ b/tests/subsys/modbus_rtu/prj.conf @@ -6,5 +6,6 @@ CONFIG_ZTEST=y CONFIG_SERIAL=y CONFIG_UART_INTERRUPT_DRIVEN=y CONFIG_UART_LINE_CTRL=n +CONFIG_MODBUS_RTU_ASCII_MODE=y CONFIG_MODBUS_RTU=y diff --git a/tests/subsys/modbus_rtu/src/main.c b/tests/subsys/modbus_rtu/src/main.c index ccc44b71a48..12109dc43b8 100644 --- a/tests/subsys/modbus_rtu/src/main.c +++ b/tests/subsys/modbus_rtu/src/main.c @@ -35,6 +35,15 @@ void test_main(void) ztest_unit_test(test_rtu_holding_reg), ztest_unit_test(test_rtu_diagnostic), ztest_unit_test(test_client_rtu_disable), + ztest_unit_test(test_server_rtu_disable), + ztest_unit_test(test_server_rtu_setup_ascii), + ztest_unit_test(test_client_rtu_setup_ascii), + ztest_unit_test(test_rtu_coil_wr_rd), + ztest_unit_test(test_rtu_di_rd), + ztest_unit_test(test_rtu_input_reg), + ztest_unit_test(test_rtu_holding_reg), + ztest_unit_test(test_rtu_diagnostic), + ztest_unit_test(test_client_rtu_disable), ztest_unit_test(test_server_rtu_disable) ); ztest_run_test_suite(modbus_client_test); diff --git a/tests/subsys/modbus_rtu/src/test_modbus.h b/tests/subsys/modbus_rtu/src/test_modbus.h index 695351205ec..99dc7b571ac 100644 --- a/tests/subsys/modbus_rtu/src/test_modbus.h +++ b/tests/subsys/modbus_rtu/src/test_modbus.h @@ -33,11 +33,13 @@ void test_server_rtu_setup_low_none(void); void test_server_rtu_setup_low_odd(void); void test_server_rtu_setup_high_even(void); +void test_server_rtu_setup_ascii(void); void test_server_rtu_disable(void); void test_client_rtu_setup_low_none(void); void test_client_rtu_setup_low_odd(void); void test_client_rtu_setup_high_even(void); +void test_client_rtu_setup_ascii(void); void test_rtu_coil_wr_rd(void); void test_rtu_di_rd(void); void test_rtu_input_reg(void); diff --git a/tests/subsys/modbus_rtu/src/test_modbus_client.c b/tests/subsys/modbus_rtu/src/test_modbus_client.c index 9d1d358ac4e..a6c9f25cc56 100644 --- a/tests/subsys/modbus_rtu/src/test_modbus_client.c +++ b/tests/subsys/modbus_rtu/src/test_modbus_client.c @@ -226,6 +226,16 @@ void test_client_rtu_setup_high_even(void) zassert_equal(err, 0, "Failed to configure RTU client"); } +void test_client_rtu_setup_ascii(void) +{ + int err; + + err = mb_rtu_cfg_client(iface, MB_TEST_BAUDRATE_HIGH, + UART_CFG_PARITY_EVEN, + MB_TEST_RESPONSE_TO, true); + zassert_equal(err, 0, "Failed to configure RTU client"); +} + void test_client_rtu_disable(void) { int err; @@ -251,6 +261,11 @@ void test_client_rtu_setup_high_even(void) ztest_test_skip(); } +void test_client_rtu_setup_ascii(void) +{ + ztest_test_skip(); +} + void test_rtu_coil_wr_rd(void) { ztest_test_skip(); diff --git a/tests/subsys/modbus_rtu/src/test_modbus_server.c b/tests/subsys/modbus_rtu/src/test_modbus_server.c index 6012eb22b9d..67ca8cb25db 100644 --- a/tests/subsys/modbus_rtu/src/test_modbus_server.c +++ b/tests/subsys/modbus_rtu/src/test_modbus_server.c @@ -209,6 +209,21 @@ void test_server_rtu_setup_high_even(void) } } +void test_server_rtu_setup_ascii(void) +{ + int err; + + if (IS_ENABLED(CONFIG_MODBUS_RTU_SERVER)) { + err = mb_rtu_cfg_server(MB_TEST_IFACE_SERVER, MB_TEST_NODE_ADDR, + MB_TEST_BAUDRATE_HIGH, + UART_CFG_PARITY_EVEN, + &mbs_cbs, true); + zassert_equal(err, 0, "Failed to configure RTU server"); + } else { + ztest_test_skip(); + } +} + void test_server_rtu_disable(void) { int err;