14
14
#include "freertos/task.h" // for task api access
15
15
#include "freertos/event_groups.h" // for event groups
16
16
#include "freertos/queue.h" // for queue api access
17
+ #include "freertos/semphr.h" // for semaphore
17
18
#include "mb_m.h" // for modbus stack master types definition
18
19
#include "port.h" // for port callback functions
19
20
#include "mbutils.h" // for mbutils functions definition for stack callback
@@ -28,7 +29,7 @@ extern BOOL xMBMasterPortSerialTxPoll(void);
28
29
29
30
/*-----------------------Master mode use these variables----------------------*/
30
31
// Actual wait time depends on the response timer
31
- #define MB_SERIAL_API_RESP_TICS (pdMS_TO_TICKS(MB_MAX_RESPONSE_TIME_MS))
32
+ #define MB_SERIAL_API_RESP_TICS (pdMS_TO_TICKS(MB_MAX_RESPONSE_TIME_MS))
32
33
33
34
static mb_master_interface_t * mbm_interface_ptr = NULL ;
34
35
static const char * TAG = "MB_CONTROLLER_MASTER" ;
@@ -127,6 +128,8 @@ static esp_err_t mbc_serial_master_destroy(void)
127
128
MB_MASTER_CHECK ((mb_error == MB_ENOERR ), ESP_ERR_INVALID_STATE , "mb stack disable failure." );
128
129
(void )vTaskDelete (mbm_opts -> mbm_task_handle );
129
130
(void )vEventGroupDelete (mbm_opts -> mbm_event_group );
131
+ vSemaphoreDelete (mbm_opts -> mbm_sema );
132
+ mbm_opts -> mbm_sema = NULL ;
130
133
mb_error = eMBMasterClose ();
131
134
MB_MASTER_CHECK ((mb_error == MB_ENOERR ), ESP_ERR_INVALID_STATE ,
132
135
"mb stack close failure returned (0x%x)." , (int )mb_error );
@@ -176,22 +179,22 @@ static esp_err_t mbc_serial_master_send_request(mb_param_request_t* request, voi
176
179
eMBMasterReqErrCode mb_error = MB_MRE_MASTER_BUSY ;
177
180
esp_err_t error = ESP_FAIL ;
178
181
179
- if (xMBMasterRunResTake (MB_SERIAL_API_RESP_TICS )) {
180
-
182
+ if (xSemaphoreTake (mbm_opts -> mbm_sema , MB_SERIAL_API_RESP_TICS ) == pdTRUE ) {
181
183
uint8_t mb_slave_addr = request -> slave_addr ;
182
184
uint8_t mb_command = request -> command ;
183
185
uint16_t mb_offset = request -> reg_start ;
184
186
uint16_t mb_size = request -> reg_size ;
185
-
187
+
186
188
// Set the buffer for callback function processing of received data
187
189
mbm_opts -> mbm_reg_buffer_ptr = (uint8_t * )data_ptr ;
188
190
mbm_opts -> mbm_reg_buffer_size = mb_size ;
189
191
190
- vMBMasterRunResRelease ();
191
-
192
192
// Calls appropriate request function to send request and waits response
193
193
switch (mb_command )
194
194
{
195
+ case MB_FUNC_OTHER_REPORT_SLAVEID :
196
+ mb_error = eMBMasterReqReportSlaveID ((UCHAR )mb_slave_addr , (LONG )MB_SERIAL_API_RESP_TICS );
197
+ break ;
195
198
case MB_FUNC_READ_COILS :
196
199
mb_error = eMBMasterReqReadCoils ((UCHAR )mb_slave_addr , (USHORT )mb_offset ,
197
200
(USHORT )mb_size , (LONG )MB_SERIAL_API_RESP_TICS );
@@ -216,7 +219,6 @@ static esp_err_t mbc_serial_master_send_request(mb_param_request_t* request, voi
216
219
mb_error = eMBMasterReqWriteHoldingRegister ( (UCHAR )mb_slave_addr , (USHORT )mb_offset ,
217
220
* (USHORT * )data_ptr , (LONG )MB_SERIAL_API_RESP_TICS );
218
221
break ;
219
-
220
222
case MB_FUNC_WRITE_MULTIPLE_REGISTERS :
221
223
mb_error = eMBMasterReqWriteMultipleHoldingRegister ( (UCHAR )mb_slave_addr ,
222
224
(USHORT )mb_offset , (USHORT )mb_size ,
@@ -237,6 +239,8 @@ static esp_err_t mbc_serial_master_send_request(mb_param_request_t* request, voi
237
239
mb_error = MB_MRE_NO_REG ;
238
240
break ;
239
241
}
242
+ } else {
243
+ ESP_LOGD (TAG , "%s:MBC semaphore take fail." , __func__ );
240
244
}
241
245
242
246
// Propagate the Modbus errors to higher level
@@ -264,11 +268,13 @@ static esp_err_t mbc_serial_master_send_request(mb_param_request_t* request, voi
264
268
break ;
265
269
266
270
default :
267
- ESP_LOGE (TAG , "%s: Incorrect return code (%x) " , __FUNCTION__ , (int )mb_error );
271
+ ESP_LOGE (TAG , "%s: Incorrect return code (0x %x) " , __FUNCTION__ , (int )mb_error );
268
272
error = ESP_FAIL ;
269
273
break ;
270
274
}
271
275
276
+ (void )xSemaphoreGive ( mbm_opts -> mbm_sema );
277
+
272
278
return error ;
273
279
}
274
280
@@ -508,7 +514,7 @@ eMBErrorCode eMBRegInputCBSerialMaster(UCHAR * pucRegBuffer, USHORT usAddress,
508
514
// If input or configuration parameters are incorrect then return an error to stack layer
509
515
if ((pucInputBuffer != NULL )
510
516
&& (usNRegs >= 1 )
511
- && (usRegInputNregs == usRegs )) {
517
+ && (( usRegInputNregs == usRegs ) || (! usAddress ) )) {
512
518
while (usRegs > 0 ) {
513
519
_XFER_2_RD (pucInputBuffer , pucRegBuffer );
514
520
usRegs -= 1 ;
@@ -698,6 +704,10 @@ esp_err_t mbc_serial_master_create(void** handler)
698
704
mbm_opts -> mbm_event_group = xEventGroupCreate ();
699
705
MB_MASTER_CHECK ((mbm_opts -> mbm_event_group != NULL ),
700
706
ESP_ERR_NO_MEM , "mb event group error." );
707
+ mbm_opts -> mbm_sema = xSemaphoreCreateBinary ();
708
+ MB_MASTER_CHECK ((mbm_opts -> mbm_sema != NULL ), ESP_ERR_NO_MEM , "%s: mbm resource create error." , __func__ );
709
+ (void )xSemaphoreGive ( mbm_opts -> mbm_sema );
710
+
701
711
// Create modbus controller task
702
712
status = xTaskCreatePinnedToCore ((void * )& modbus_master_task ,
703
713
"modbus_matask" ,
0 commit comments