mirror of
https://github.com/espressif/esp-modbus.git
synced 2025-07-30 10:27:16 +02:00
bugfix next message shifting
This commit is contained in:
@ -174,66 +174,71 @@ static esp_err_t mbc_serial_master_send_request(mb_param_request_t* request, voi
|
|||||||
MB_MASTER_CHECK((data_ptr != NULL),
|
MB_MASTER_CHECK((data_ptr != NULL),
|
||||||
ESP_ERR_INVALID_ARG, "mb incorrect data pointer.");
|
ESP_ERR_INVALID_ARG, "mb incorrect data pointer.");
|
||||||
|
|
||||||
eMBMasterReqErrCode mb_error = MB_MRE_NO_REG;
|
eMBMasterReqErrCode mb_error = MB_MRE_MASTER_BUSY;
|
||||||
esp_err_t error = ESP_FAIL;
|
esp_err_t error = ESP_FAIL;
|
||||||
|
|
||||||
uint8_t mb_slave_addr = request->slave_addr;
|
if (xMBMasterRunResTake(MB_RESPONSE_TICS)) {
|
||||||
uint8_t mb_command = request->command;
|
|
||||||
uint16_t mb_offset = request->reg_start;
|
uint8_t mb_slave_addr = request->slave_addr;
|
||||||
uint16_t mb_size = request->reg_size;
|
uint8_t mb_command = request->command;
|
||||||
|
uint16_t mb_offset = request->reg_start;
|
||||||
|
uint16_t mb_size = request->reg_size;
|
||||||
|
|
||||||
|
// Set the buffer for callback function processing of received data
|
||||||
|
mbm_opts->mbm_reg_buffer_ptr = (uint8_t*)data_ptr;
|
||||||
|
mbm_opts->mbm_reg_buffer_size = mb_size;
|
||||||
|
|
||||||
// Set the buffer for callback function processing of received data
|
vMBMasterRunResRelease();
|
||||||
mbm_opts->mbm_reg_buffer_ptr = (uint8_t*)data_ptr;
|
|
||||||
mbm_opts->mbm_reg_buffer_size = mb_size;
|
|
||||||
|
|
||||||
// Calls appropriate request function to send request and waits response
|
// Calls appropriate request function to send request and waits response
|
||||||
switch(mb_command)
|
switch(mb_command)
|
||||||
{
|
{
|
||||||
case MB_FUNC_READ_COILS:
|
case MB_FUNC_READ_COILS:
|
||||||
mb_error = eMBMasterReqReadCoils((UCHAR)mb_slave_addr, (USHORT)mb_offset,
|
mb_error = eMBMasterReqReadCoils((UCHAR)mb_slave_addr, (USHORT)mb_offset,
|
||||||
(USHORT)mb_size , (LONG)MB_RESPONSE_TICS );
|
(USHORT)mb_size , (LONG)MB_RESPONSE_TICS );
|
||||||
break;
|
break;
|
||||||
case MB_FUNC_WRITE_SINGLE_COIL:
|
case MB_FUNC_WRITE_SINGLE_COIL:
|
||||||
mb_error = eMBMasterReqWriteCoil((UCHAR)mb_slave_addr, (USHORT)mb_offset,
|
mb_error = eMBMasterReqWriteCoil((UCHAR)mb_slave_addr, (USHORT)mb_offset,
|
||||||
*(USHORT*)data_ptr, (LONG)MB_RESPONSE_TICS );
|
*(USHORT*)data_ptr, (LONG)MB_RESPONSE_TICS );
|
||||||
break;
|
break;
|
||||||
case MB_FUNC_WRITE_MULTIPLE_COILS:
|
case MB_FUNC_WRITE_MULTIPLE_COILS:
|
||||||
mb_error = eMBMasterReqWriteMultipleCoils((UCHAR)mb_slave_addr, (USHORT)mb_offset,
|
mb_error = eMBMasterReqWriteMultipleCoils((UCHAR)mb_slave_addr, (USHORT)mb_offset,
|
||||||
(USHORT)mb_size, (UCHAR*)data_ptr, (LONG)MB_RESPONSE_TICS);
|
(USHORT)mb_size, (UCHAR*)data_ptr, (LONG)MB_RESPONSE_TICS);
|
||||||
break;
|
break;
|
||||||
case MB_FUNC_READ_DISCRETE_INPUTS:
|
case MB_FUNC_READ_DISCRETE_INPUTS:
|
||||||
mb_error = eMBMasterReqReadDiscreteInputs((UCHAR)mb_slave_addr, (USHORT)mb_offset,
|
mb_error = eMBMasterReqReadDiscreteInputs((UCHAR)mb_slave_addr, (USHORT)mb_offset,
|
||||||
(USHORT)mb_size, (LONG)MB_RESPONSE_TICS );
|
|
||||||
break;
|
|
||||||
case MB_FUNC_READ_HOLDING_REGISTER:
|
|
||||||
mb_error = eMBMasterReqReadHoldingRegister((UCHAR)mb_slave_addr, (USHORT)mb_offset,
|
|
||||||
(USHORT)mb_size, (LONG)MB_RESPONSE_TICS );
|
(USHORT)mb_size, (LONG)MB_RESPONSE_TICS );
|
||||||
break;
|
break;
|
||||||
case MB_FUNC_WRITE_REGISTER:
|
case MB_FUNC_READ_HOLDING_REGISTER:
|
||||||
mb_error = eMBMasterReqWriteHoldingRegister( (UCHAR)mb_slave_addr, (USHORT)mb_offset,
|
mb_error = eMBMasterReqReadHoldingRegister((UCHAR)mb_slave_addr, (USHORT)mb_offset,
|
||||||
*(USHORT*)data_ptr, (LONG)MB_RESPONSE_TICS );
|
(USHORT)mb_size, (LONG)MB_RESPONSE_TICS );
|
||||||
break;
|
break;
|
||||||
|
case MB_FUNC_WRITE_REGISTER:
|
||||||
|
mb_error = eMBMasterReqWriteHoldingRegister( (UCHAR)mb_slave_addr, (USHORT)mb_offset,
|
||||||
|
*(USHORT*)data_ptr, (LONG)MB_RESPONSE_TICS );
|
||||||
|
break;
|
||||||
|
|
||||||
case MB_FUNC_WRITE_MULTIPLE_REGISTERS:
|
case MB_FUNC_WRITE_MULTIPLE_REGISTERS:
|
||||||
mb_error = eMBMasterReqWriteMultipleHoldingRegister( (UCHAR)mb_slave_addr,
|
mb_error = eMBMasterReqWriteMultipleHoldingRegister( (UCHAR)mb_slave_addr,
|
||||||
(USHORT)mb_offset, (USHORT)mb_size,
|
(USHORT)mb_offset, (USHORT)mb_size,
|
||||||
(USHORT*)data_ptr, (LONG)MB_RESPONSE_TICS );
|
(USHORT*)data_ptr, (LONG)MB_RESPONSE_TICS );
|
||||||
break;
|
break;
|
||||||
case MB_FUNC_READWRITE_MULTIPLE_REGISTERS:
|
case MB_FUNC_READWRITE_MULTIPLE_REGISTERS:
|
||||||
mb_error = eMBMasterReqReadWriteMultipleHoldingRegister( (UCHAR)mb_slave_addr, (USHORT)mb_offset,
|
mb_error = eMBMasterReqReadWriteMultipleHoldingRegister( (UCHAR)mb_slave_addr, (USHORT)mb_offset,
|
||||||
(USHORT)mb_size, (USHORT*)data_ptr,
|
(USHORT)mb_size, (USHORT*)data_ptr,
|
||||||
(USHORT)mb_offset, (USHORT)mb_size,
|
(USHORT)mb_offset, (USHORT)mb_size,
|
||||||
(LONG)MB_RESPONSE_TICS );
|
(LONG)MB_RESPONSE_TICS );
|
||||||
break;
|
break;
|
||||||
case MB_FUNC_READ_INPUT_REGISTER:
|
case MB_FUNC_READ_INPUT_REGISTER:
|
||||||
mb_error = eMBMasterReqReadInputRegister( (UCHAR)mb_slave_addr, (USHORT)mb_offset,
|
mb_error = eMBMasterReqReadInputRegister( (UCHAR)mb_slave_addr, (USHORT)mb_offset,
|
||||||
(USHORT)mb_size, (LONG) MB_RESPONSE_TICS );
|
(USHORT)mb_size, (LONG) MB_RESPONSE_TICS );
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ESP_LOGE(TAG, "%s: Incorrect function in request (%u) ",
|
ESP_LOGE(TAG, "%s: Incorrect function in request (%u) ",
|
||||||
__FUNCTION__, mb_command);
|
__FUNCTION__, mb_command);
|
||||||
mb_error = MB_MRE_NO_REG;
|
mb_error = MB_MRE_NO_REG;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Propagate the Modbus errors to higher level
|
// Propagate the Modbus errors to higher level
|
||||||
|
@ -255,68 +255,73 @@ static esp_err_t mbc_tcp_master_send_request(mb_param_request_t* request, void*
|
|||||||
MB_MASTER_CHECK((request != NULL), ESP_ERR_INVALID_ARG, "mb request structure.");
|
MB_MASTER_CHECK((request != NULL), ESP_ERR_INVALID_ARG, "mb request structure.");
|
||||||
MB_MASTER_CHECK((data_ptr != NULL), ESP_ERR_INVALID_ARG, "mb incorrect data pointer.");
|
MB_MASTER_CHECK((data_ptr != NULL), ESP_ERR_INVALID_ARG, "mb incorrect data pointer.");
|
||||||
|
|
||||||
eMBMasterReqErrCode mb_error = MB_MRE_NO_REG;
|
eMBMasterReqErrCode mb_error = MB_MRE_MASTER_BUSY;
|
||||||
esp_err_t error = ESP_FAIL;
|
esp_err_t error = ESP_FAIL;
|
||||||
|
|
||||||
uint8_t mb_slave_addr = request->slave_addr;
|
if (xMBMasterRunResTake(MB_RESPONSE_TIMEOUT)) {
|
||||||
uint8_t mb_command = request->command;
|
|
||||||
uint16_t mb_offset = request->reg_start;
|
uint8_t mb_slave_addr = request->slave_addr;
|
||||||
uint16_t mb_size = request->reg_size;
|
uint8_t mb_command = request->command;
|
||||||
|
uint16_t mb_offset = request->reg_start;
|
||||||
|
uint16_t mb_size = request->reg_size;
|
||||||
|
|
||||||
|
// Set the buffer for callback function processing of received data
|
||||||
|
mbm_opts->mbm_reg_buffer_ptr = (uint8_t*)data_ptr;
|
||||||
|
mbm_opts->mbm_reg_buffer_size = mb_size;
|
||||||
|
|
||||||
// Set the buffer for callback function processing of received data
|
vMBMasterRunResRelease();
|
||||||
mbm_opts->mbm_reg_buffer_ptr = (uint8_t*)data_ptr;
|
|
||||||
mbm_opts->mbm_reg_buffer_size = mb_size;
|
|
||||||
|
|
||||||
// Calls appropriate request function to send request and waits response
|
// Calls appropriate request function to send request and waits response
|
||||||
switch(mb_command)
|
switch(mb_command)
|
||||||
{
|
{
|
||||||
case MB_FUNC_READ_COILS:
|
case MB_FUNC_READ_COILS:
|
||||||
mb_error = eMBMasterReqReadCoils((UCHAR)mb_slave_addr, (USHORT)mb_offset,
|
mb_error = eMBMasterReqReadCoils((UCHAR)mb_slave_addr, (USHORT)mb_offset,
|
||||||
(USHORT)mb_size, (LONG)MB_RESPONSE_TIMEOUT);
|
(USHORT)mb_size, (LONG)MB_RESPONSE_TIMEOUT);
|
||||||
break;
|
break;
|
||||||
case MB_FUNC_WRITE_SINGLE_COIL:
|
case MB_FUNC_WRITE_SINGLE_COIL:
|
||||||
mb_error = eMBMasterReqWriteCoil((UCHAR)mb_slave_addr, (USHORT)mb_offset,
|
mb_error = eMBMasterReqWriteCoil((UCHAR)mb_slave_addr, (USHORT)mb_offset,
|
||||||
*(USHORT *)data_ptr, (LONG)MB_RESPONSE_TIMEOUT);
|
*(USHORT *)data_ptr, (LONG)MB_RESPONSE_TIMEOUT);
|
||||||
break;
|
break;
|
||||||
case MB_FUNC_WRITE_MULTIPLE_COILS:
|
case MB_FUNC_WRITE_MULTIPLE_COILS:
|
||||||
mb_error = eMBMasterReqWriteMultipleCoils((UCHAR)mb_slave_addr, (USHORT)mb_offset,
|
mb_error = eMBMasterReqWriteMultipleCoils((UCHAR)mb_slave_addr, (USHORT)mb_offset,
|
||||||
(USHORT)mb_size, (UCHAR *)data_ptr,
|
(USHORT)mb_size, (UCHAR *)data_ptr,
|
||||||
(LONG)MB_RESPONSE_TIMEOUT);
|
(LONG)MB_RESPONSE_TIMEOUT);
|
||||||
break;
|
break;
|
||||||
case MB_FUNC_READ_DISCRETE_INPUTS:
|
case MB_FUNC_READ_DISCRETE_INPUTS:
|
||||||
mb_error = eMBMasterReqReadDiscreteInputs((UCHAR)mb_slave_addr, (USHORT)mb_offset,
|
mb_error = eMBMasterReqReadDiscreteInputs((UCHAR)mb_slave_addr, (USHORT)mb_offset,
|
||||||
(USHORT)mb_size, (LONG)MB_RESPONSE_TIMEOUT);
|
(USHORT)mb_size, (LONG)MB_RESPONSE_TIMEOUT);
|
||||||
break;
|
break;
|
||||||
case MB_FUNC_READ_HOLDING_REGISTER:
|
case MB_FUNC_READ_HOLDING_REGISTER:
|
||||||
mb_error = eMBMasterReqReadHoldingRegister((UCHAR)mb_slave_addr, (USHORT)mb_offset,
|
mb_error = eMBMasterReqReadHoldingRegister((UCHAR)mb_slave_addr, (USHORT)mb_offset,
|
||||||
(USHORT)mb_size, (LONG)MB_RESPONSE_TIMEOUT);
|
(USHORT)mb_size, (LONG)MB_RESPONSE_TIMEOUT);
|
||||||
break;
|
break;
|
||||||
case MB_FUNC_WRITE_REGISTER:
|
case MB_FUNC_WRITE_REGISTER:
|
||||||
mb_error = eMBMasterReqWriteHoldingRegister((UCHAR)mb_slave_addr, (USHORT)mb_offset,
|
mb_error = eMBMasterReqWriteHoldingRegister((UCHAR)mb_slave_addr, (USHORT)mb_offset,
|
||||||
*(USHORT *)data_ptr, (LONG)MB_RESPONSE_TIMEOUT);
|
*(USHORT *)data_ptr, (LONG)MB_RESPONSE_TIMEOUT);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MB_FUNC_WRITE_MULTIPLE_REGISTERS:
|
case MB_FUNC_WRITE_MULTIPLE_REGISTERS:
|
||||||
mb_error = eMBMasterReqWriteMultipleHoldingRegister((UCHAR)mb_slave_addr,
|
mb_error = eMBMasterReqWriteMultipleHoldingRegister((UCHAR)mb_slave_addr,
|
||||||
(USHORT)mb_offset, (USHORT)mb_size,
|
|
||||||
(USHORT *)data_ptr, (LONG)MB_RESPONSE_TIMEOUT);
|
|
||||||
break;
|
|
||||||
case MB_FUNC_READWRITE_MULTIPLE_REGISTERS:
|
|
||||||
mb_error = eMBMasterReqReadWriteMultipleHoldingRegister((UCHAR)mb_slave_addr, (USHORT)mb_offset,
|
|
||||||
(USHORT)mb_size, (USHORT *)data_ptr,
|
|
||||||
(USHORT)mb_offset, (USHORT)mb_size,
|
(USHORT)mb_offset, (USHORT)mb_size,
|
||||||
(LONG)MB_RESPONSE_TIMEOUT);
|
(USHORT *)data_ptr, (LONG)MB_RESPONSE_TIMEOUT);
|
||||||
break;
|
break;
|
||||||
case MB_FUNC_READ_INPUT_REGISTER:
|
case MB_FUNC_READWRITE_MULTIPLE_REGISTERS:
|
||||||
mb_error = eMBMasterReqReadInputRegister((UCHAR)mb_slave_addr, (USHORT)mb_offset,
|
mb_error = eMBMasterReqReadWriteMultipleHoldingRegister((UCHAR)mb_slave_addr, (USHORT)mb_offset,
|
||||||
(USHORT)mb_size, (LONG)MB_RESPONSE_TIMEOUT);
|
(USHORT)mb_size, (USHORT *)data_ptr,
|
||||||
break;
|
(USHORT)mb_offset, (USHORT)mb_size,
|
||||||
default:
|
(LONG)MB_RESPONSE_TIMEOUT);
|
||||||
ESP_LOGE(TAG, "%s: Incorrect function in request (%u) ",
|
break;
|
||||||
__FUNCTION__, mb_command);
|
case MB_FUNC_READ_INPUT_REGISTER:
|
||||||
mb_error = MB_MRE_NO_REG;
|
mb_error = eMBMasterReqReadInputRegister((UCHAR)mb_slave_addr, (USHORT)mb_offset,
|
||||||
break;
|
(USHORT)mb_size, (LONG)MB_RESPONSE_TIMEOUT);
|
||||||
}
|
break;
|
||||||
|
default:
|
||||||
|
ESP_LOGE(TAG, "%s: Incorrect function in request (%u) ",
|
||||||
|
__FUNCTION__, mb_command);
|
||||||
|
mb_error = MB_MRE_NO_REG;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Propagate the Modbus errors to higher level
|
// Propagate the Modbus errors to higher level
|
||||||
switch(mb_error)
|
switch(mb_error)
|
||||||
|
Reference in New Issue
Block a user