Skip to content

Commit

Permalink
freemodbus: fix mb controller parity propagation issues
Browse files Browse the repository at this point in the history
Closes #6377
  • Loading branch information
alisitsyn committed Feb 17, 2021
1 parent 391b2eb commit be68c0e
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 13 deletions.
7 changes: 4 additions & 3 deletions components/freemodbus/port/port.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down Expand Up @@ -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 */
Expand Down
4 changes: 3 additions & 1 deletion components/freemodbus/port/portserial.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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:
Expand Down
4 changes: 3 additions & 1 deletion components/freemodbus/port/portserial_m.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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();
Expand Down

0 comments on commit be68c0e

Please sign in to comment.