From 33e70f5bafc67aaf95d4b95e4c5ebfcb8985e551 Mon Sep 17 00:00:00 2001 From: Duke NUCem Date: Mon, 11 Oct 2021 18:12:43 +0200 Subject: [PATCH] MODBUS write multiple registers done --- fw/Core/Inc/modbus.h | 2 +- fw/Core/Src/main.c | 40 ++++++++++--------- fw/Core/Src/modbus.c | 2 +- .../write_multiple_holding_registers_test.py | 2 +- 4 files changed, 25 insertions(+), 21 deletions(-) diff --git a/fw/Core/Inc/modbus.h b/fw/Core/Inc/modbus.h index 3eafbe4..a215328 100644 --- a/fw/Core/Inc/modbus.h +++ b/fw/Core/Inc/modbus.h @@ -176,6 +176,6 @@ int8_t modbus_slave_set_address(uint8_t address); /* modbus callback function type - should be implemented by user (e.g. in main.c) */ int8_t modbus_slave_callback(modbus_transaction_t *transaction); /* UART transmit function type - should be implemented by user (e.g. in main.c) */ -int8_t modbus_transmit_function(uint8_t *buffer, int data_len); +int8_t modbus_transmit_function(uint8_t *buffer, uint16_t data_len); #endif /* SRC_MODBUS_H_ */ diff --git a/fw/Core/Src/main.c b/fw/Core/Src/main.c index f2c5493..48c41a4 100644 --- a/fw/Core/Src/main.c +++ b/fw/Core/Src/main.c @@ -110,6 +110,7 @@ uint16_t sps30_measured_data[10]; config_t sensor_config; uint8_t sensor_config_pending_write = 0; uint8_t baudrate_changed = 0; +uint8_t modbus_address_changed = 0; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ @@ -119,9 +120,7 @@ static void MX_I2C1_Init(void); static void MX_LPUART1_UART_Init(void); static void MX_TIM21_Init(void); /* USER CODE BEGIN PFP */ -int8_t modbus_slave_callback(modbus_transaction_t *transaction); -int8_t modbus_transmit_function(uint8_t *buffer, int data_len); -void LPUART1_TX_Buffer(uint8_t* buffer_tx, uint8_t buffer_tx_len); +void LPUART1_TX_Buffer(uint8_t* buffer_tx, uint16_t buffer_tx_len); /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ @@ -259,12 +258,16 @@ int main(void) if (sensor_config_pending_write) { // config_write(&sensor_config); } - if (baudrate_changed == 1) + if (modbus_address_changed) + { + modbus_slave_set_address(sensor_config.modbus_addr); + } + if (baudrate_changed) { /* TODO: TEST */ - LL_LPUART_Disable(LPUART1); - MX_LPUART1_UART_Init(); - LL_LPUART_Enable(LPUART1); +// LL_LPUART_Disable(LPUART1); +// MX_LPUART1_UART_Init(); +// LL_LPUART_Enable(LPUART1); baudrate_changed = 0; } @@ -604,10 +607,10 @@ static void MX_GPIO_Init(void) } /* USER CODE BEGIN 4 */ -void LPUART1_TX_Buffer(uint8_t* buffer_tx, uint8_t buffer_tx_len) +void LPUART1_TX_Buffer(uint8_t* buffer_tx, uint16_t buffer_tx_len) { __disable_irq(); - for (uint8_t i = 0; i < buffer_tx_len; i++) + for (uint16_t i = 0; i < buffer_tx_len; i++) { LL_LPUART_TransmitData9(LPUART1, buffer_tx[i]); while (!LL_LPUART_IsActiveFlag_TXE(LPUART1)); @@ -693,30 +696,31 @@ int8_t modbus_slave_callback(modbus_transaction_t *transaction) switch (register_number) { case REGISTER_NUM_LED_ON: - sensor_config.led_on = (uint8_t) transaction->holding_registers[0]; + sensor_config.led_on = (uint8_t) transaction->holding_registers[i]; break; case REGISTER_NUM_LED_BRIGHTNESS: - sensor_config.led_brightness = (uint16_t) transaction->holding_registers[0]; + sensor_config.led_brightness = (uint16_t) transaction->holding_registers[i]; break; case REGISTER_NUM_LED_SMOOTH: - sensor_config.led_smooth = (uint16_t) transaction->holding_registers[0]; + sensor_config.led_smooth = (uint16_t) transaction->holding_registers[i]; break; case REGISTER_NUM_CO2_ALERT_LIMIT1: - sensor_config.led_co2_alert_limit1 = (uint16_t) transaction->holding_registers[0]; + sensor_config.led_co2_alert_limit1 = (uint16_t) transaction->holding_registers[i]; break; case REGISTER_NUM_CO2_ALERT_LIMIT2: - sensor_config.led_co2_alert_limit2 = (uint16_t) transaction->holding_registers[0]; + sensor_config.led_co2_alert_limit2 = (uint16_t) transaction->holding_registers[i]; break; case REGISTER_NUM_SCD4x_T_OFFSET: - sensor_config.scd4x_t_offset = (int16_t) transaction->holding_registers[0]; + sensor_config.scd4x_t_offset = (int16_t) transaction->holding_registers[i]; break; case REGISTER_NUM_MODBUS_ADDR: - sensor_config.modbus_addr = (uint16_t) transaction->holding_registers[0]; + sensor_config.modbus_addr = (uint16_t) transaction->holding_registers[i]; + modbus_address_changed = 1; break; case REGISTER_NUM_BAUDRATE: if (transaction->holding_registers[0] < config_baudrates_length) { - sensor_config.baudrate_index = (uint16_t) (transaction->holding_registers[0]); + sensor_config.baudrate_index = (uint16_t) (transaction->holding_registers[i]); baudrate_changed = 1; } break; @@ -735,7 +739,7 @@ int8_t modbus_slave_callback(modbus_transaction_t *transaction) return MODBUS_ERROR_FUNCTION_NOT_IMPLEMENTED; /* nothing implemented yet! TODO */ } -int8_t modbus_transmit_function(uint8_t *buffer, int data_len) +int8_t modbus_transmit_function(uint8_t *buffer, uint16_t data_len) { /* TODO */ LPUART1_TX_Buffer(buffer, data_len); diff --git a/fw/Core/Src/modbus.c b/fw/Core/Src/modbus.c index ef2eeba..4ec6e09 100644 --- a/fw/Core/Src/modbus.c +++ b/fw/Core/Src/modbus.c @@ -93,7 +93,7 @@ int8_t modbus_copy_reply_to_buffer(uint8_t *buffer, uint8_t *msg_len, modbus_tra buffer[4] = (uint8_t) (transaction->register_count >> 8); buffer[5] = (uint8_t) transaction->register_count; *msg_len = 8; - + break; } } crc16 = modbus_CRC16(buffer, *msg_len - 2); /* last two bytes is the checksum itself */ diff --git a/tests/write_multiple_holding_registers_test.py b/tests/write_multiple_holding_registers_test.py index add79fd..766025d 100755 --- a/tests/write_multiple_holding_registers_test.py +++ b/tests/write_multiple_holding_registers_test.py @@ -32,7 +32,7 @@ CO2_alert_limit_1 = 1000 CO2_alert_limit_2 = 2000 SCD4x_temperature_offset = 0 MODBUS_address = 254 -baudrate = 0 +baudrate = 1 registers = [LED_on, LED_brightness, LED_smooth, CO2_alert_limit_1, CO2_alert_limit_2, SCD4x_temperature_offset, MODBUS_address, baudrate] # write to holding registers print('---- Writing to multiple holding registers ----')