diff --git a/components/freemodbus/port/port.h b/components/freemodbus/port/port.h index d9e2cb794c..06d7a28c79 100644 --- a/components/freemodbus/port/port.h +++ b/components/freemodbus/port/port.h @@ -17,7 +17,6 @@ #define PORT_COMMON_H_ #include "freertos/FreeRTOS.h" -#include "freertos/xtensa_api.h" #include "esp_log.h" // for ESP_LOGE macro #include "sdkconfig.h" @@ -77,15 +76,17 @@ typedef long LONG; void vMBPortEnterCritical(void); void vMBPortExitCritical(void); -#define ENTER_CRITICAL_SECTION( ) { ESP_LOGD(MB_PORT_TAG,"%s: Port enter critical.", __func__); \ +#define ENTER_CRITICAL_SECTION( ) { ESP_EARLY_LOGD(MB_PORT_TAG,"%s: Port enter critical.", __func__); \ vMBPortEnterCritical(); } #define EXIT_CRITICAL_SECTION( ) { vMBPortExitCritical(); \ - ESP_LOGD(MB_PORT_TAG,"%s: Port exit critical", __func__); } + ESP_EARLY_LOGD(MB_PORT_TAG,"%s: Port exit critical", __func__); } #define MB_PORT_CHECK_EVENT( event, mask ) ( event & mask ) #define MB_PORT_CLEAR_EVENT( event, mask ) do { event &= ~mask; } while(0) +#define MB_PORT_PARITY_GET(parity) ((parity != UART_PARITY_DISABLE) ? \ + ((parity == UART_PARITY_ODD) ? MB_PAR_ODD : MB_PAR_EVEN) : MB_PAR_NONE) #ifdef __cplusplus PR_END_EXTERN_C #endif /* __cplusplus */ diff --git a/components/freemodbus/port/portserial.c b/components/freemodbus/port/portserial.c index 102e470868..9218ccb382 100644 --- a/components/freemodbus/port/portserial.c +++ b/components/freemodbus/port/portserial.c @@ -182,7 +182,6 @@ BOOL xMBPortSerialInit(UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, eMBParity eParity) { esp_err_t xErr = ESP_OK; - MB_PORT_CHECK((eParity <= MB_PAR_EVEN), FALSE, "mb serial set parity failure."); // Set communication port number ucUartNumber = ucPORT; // Configure serial communication parameters @@ -198,6 +197,9 @@ BOOL xMBPortSerialInit(UCHAR ucPORT, ULONG ulBaudRate, case MB_PAR_EVEN: ucParity = UART_PARITY_EVEN; break; + default: + ESP_LOGE(TAG, "Incorrect parity option: %d", eParity); + return FALSE; } switch(ucDataBits){ case 5: diff --git a/components/freemodbus/port/portserial_m.c b/components/freemodbus/port/portserial_m.c index 1caa63da06..feddbf75af 100644 --- a/components/freemodbus/port/portserial_m.c +++ b/components/freemodbus/port/portserial_m.c @@ -177,7 +177,6 @@ static void vUartTask(void* pvParameters) BOOL xMBMasterPortSerialInit( UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, eMBParity eParity ) { esp_err_t xErr = ESP_OK; - MB_PORT_CHECK((eParity <= MB_PAR_EVEN), FALSE, "mb serial set parity failure."); // Set communication port number ucUartNumber = ucPORT; // Configure serial communication parameters @@ -193,6 +192,9 @@ BOOL xMBMasterPortSerialInit( UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, case MB_PAR_EVEN: ucParity = UART_PARITY_EVEN; break; + default: + ESP_LOGE(TAG, "Incorrect parity option: %d", eParity); + return FALSE; } switch(ucDataBits){ case 5: diff --git a/components/freemodbus/serial_master/modbus_controller/mbc_serial_master.c b/components/freemodbus/serial_master/modbus_controller/mbc_serial_master.c index 909f932fc6..0a2a26ee54 100644 --- a/components/freemodbus/serial_master/modbus_controller/mbc_serial_master.c +++ b/components/freemodbus/serial_master/modbus_controller/mbc_serial_master.c @@ -83,7 +83,7 @@ static esp_err_t mbc_serial_master_setup(void* comm_info) (uint32_t)comm_info_ptr->mode); MB_MASTER_CHECK((comm_info_ptr->port < UART_NUM_MAX), ESP_ERR_INVALID_ARG, "mb wrong port to set = (0x%x).", (uint32_t)comm_info_ptr->port); - MB_MASTER_CHECK((comm_info_ptr->parity <= UART_PARITY_EVEN), ESP_ERR_INVALID_ARG, + MB_MASTER_CHECK((comm_info_ptr->parity <= UART_PARITY_ODD), ESP_ERR_INVALID_ARG, "mb wrong parity option = (0x%x).", (uint32_t)comm_info_ptr->parity); // Save the communication options mbm_opts->mbm_comm = *(mb_communication_info_t*)comm_info_ptr; @@ -102,7 +102,9 @@ static esp_err_t mbc_serial_master_start(void) // Initialize Modbus stack using mbcontroller parameters status = eMBMasterInit((eMBMode)comm_info->mode, (UCHAR)comm_info->port, - (ULONG)comm_info->baudrate, (eMBParity)comm_info->parity); + (ULONG)comm_info->baudrate, + MB_PORT_PARITY_GET(comm_info->parity)); + MB_MASTER_CHECK((status == MB_ENOERR), ESP_ERR_INVALID_STATE, "mb stack initialization failure, eMBInit() returns (0x%x).", status); status = eMBMasterEnable(); diff --git a/components/freemodbus/serial_slave/modbus_controller/mbc_serial_slave.c b/components/freemodbus/serial_slave/modbus_controller/mbc_serial_slave.c index edbb12a725..f9818995ca 100644 --- a/components/freemodbus/serial_slave/modbus_controller/mbc_serial_slave.c +++ b/components/freemodbus/serial_slave/modbus_controller/mbc_serial_slave.c @@ -75,7 +75,7 @@ static esp_err_t mbc_serial_slave_setup(void* comm_info) (uint32_t)comm_settings->slave_addr); MB_SLAVE_CHECK((comm_settings->port < UART_NUM_MAX), ESP_ERR_INVALID_ARG, "mb wrong port to set = (0x%x).", (uint32_t)comm_settings->port); - MB_SLAVE_CHECK((comm_settings->parity <= UART_PARITY_EVEN), ESP_ERR_INVALID_ARG, + MB_SLAVE_CHECK((comm_settings->parity <= UART_PARITY_ODD), ESP_ERR_INVALID_ARG, "mb wrong parity option = (0x%x).", (uint32_t)comm_settings->parity); // Set communication options of the controller @@ -91,12 +91,15 @@ static esp_err_t mbc_serial_slave_start(void) "Slave interface is not correctly initialized."); mb_slave_options_t* mbs_opts = &mbs_interface_ptr->opts; eMBErrorCode status = MB_EIO; + const mb_communication_info_t* comm_info = (mb_communication_info_t*)&mbs_opts->mbs_comm; + // Initialize Modbus stack using mbcontroller parameters - status = eMBInit((eMBMode)mbs_opts->mbs_comm.mode, - (UCHAR)mbs_opts->mbs_comm.slave_addr, - (UCHAR)mbs_opts->mbs_comm.port, - (ULONG)mbs_opts->mbs_comm.baudrate, - (eMBParity)mbs_opts->mbs_comm.parity); + status = eMBInit((eMBMode)comm_info->mode, + (UCHAR)comm_info->slave_addr, + (UCHAR)comm_info->port, + (ULONG)comm_info->baudrate, + MB_PORT_PARITY_GET(comm_info->parity)); + MB_SLAVE_CHECK((status == MB_ENOERR), ESP_ERR_INVALID_STATE, "mb stack initialization failure, eMBInit() returns (0x%x).", status); status = eMBEnable();