Search code examples
copenwrtmodbus

Getting segmentation fault for modbus_report_slave_id function in libmodbus in c


I am trying to get slave ID information using report_slave_ID API in modbus. I am getting segmentation fault for the same. Expected response is 38 bytes.

(modbus command : [28][11][DF][BC])

I am able to use same command through termios and get required output but getting segmentation fault for this command using libmodbus API: modbus_report_slave_id(modbus_t *ctx, uint8_t *dest)

modbus_t *ctx;
int32_t i32_read_ret = 0;
int32_t i32_Index = 0;
uint8_t gui16_PonselInputRegVal[40]; 

//Assigning Parity as per Modbus requirement

// Creating Modbus rtu 
ctx = modbus_new_rtu("/dev/ttyS1",9600, 0,8,2);

if(ctx == NULL)
{
   // DBG_FPRINTF(stderr,"Unable to create the libmodbus context for RTU: %s\n", modbus_strerror(errno));
    DBG_PRINTF("Unable to create the libmodbus context for RTU\n");
    DBG_PROCEDURE_LOG("Exiting Read_Meter function\n");
    return FAILURE;
}
else
{
    printf("Modbus context for RTU created\n");
}   

// Setting Slave ID 
if(modbus_set_slave(ctx,40) == -1)
{
    //DBG_FPRINTF(stderr, "Unable to set the slave ID in  context for RTU: %s\n", modbus_strerror(errno));
    DBG_PRINTF("Unable to set the slave ID in  context for RTU\n");
    modbus_free(ctx);
    DBG_PROCEDURE_LOG("Exiting Read_Meter function\n");
    return FAILURE;
}
else
{
    printf("Slave ID set successful\n");
}   

//TRUE: Debug message enable, FALSE: Debug message disable
modbus_set_debug(ctx,TRUE);

if(modbus_connect(ctx) == -1) 
{
   // DBG_FPRINTF(stderr, "modbus connection failed: %s\n", modbus_strerror(errno));
    DBG_PRINTF("modbus connection failed\n");
    modbus_free(ctx);
    DBG_PROCEDURE_LOG("\nExiting Read_Meter function\n");
    return FAILURE;
}

//modbus_report_slave_id(modbus_t *ctx, uint8_t *dest)

i32_read_ret=modbus_report_slave_id(ctx,gui16_PonselInputRegVal);
printf("i32_read_ret : %d\n",i32_read_ret);


    //Closing Modbus 
modbus_close(ctx);
modbus_free(ctx);

O/p :

Modbus context for RTU created
Slave ID set successful
Opening /dev/ttyS1 at 9600 bauds (N, 8, 2)
[28][11][DF][BC]
Waiting for a confirmation...
<28><11><21><4E><65><70><68><65><6C><6F><2F><54><55><2F><54><65><6D><70><65><72><61><74><75><72><65><20><50><4F><4E><53><45><4C><20><20><20><FF><17><57>
Segmentation fault

Solution

  • Issue resolved after using library version 3.1.2