c-libmodbus的独立连接功能



我正在尝试对Mod总线连接的libmodbus下的操作进行分组,并将值转换为两个更简单的函数,如下所示
但是,当我尝试从设备获取值时,它总是会导致Segmentation fault (core dumped)。(get_floatmodbus_read_registers(
有人能告诉我如何修复它吗?

int connect(char *ip_addr, struct timeval timeout, modbus_t *ctx){
int fail = 0;
ctx = modbus_new_tcp(ip_addr, MODBUS_SERVER_PORT);

modbus_set_slave(ctx, MODBUS_DEVICE_ID);
modbus_set_debug(ctx, MODBUS_DEBUG);
timeout.tv_sec = MODBUS_TIMEOUT_SEC;
timeout.tv_usec = MODBUS_TIMEOUT_USEC;
modbus_get_byte_timeout(ctx, &timeout.tv_sec, &timeout.tv_usec);
timeout.tv_sec = MODBUS_TIMEOUT_SEC;
timeout.tv_usec = MODBUS_TIMEOUT_USEC;
modbus_set_response_timeout(ctx, timeout.tv_sec, timeout.tv_usec);

fail = modbus_connect(ctx);
if (fail == -1) {
fprintf(stderr, "Connection failed: %sn",
modbus_strerror(errno));
modbus_free(ctx);
fail = -1;
}
return fail;
}
int get_float(modbus_t *ctx, uint16_t addr, float *val){
int fail = 0;
__uint16_t value[2];
printf("1n");
fail = modbus_read_registers(ctx, (addr-1), 2, value);
printf("2n");
if(fail <= 0) {
fprintf(stderr, "Reading error(%d): %sn", addr, modbus_strerror(errno));
} else {
*val = modbus_get_float_abcd(value);
}
return fail;
}

此外,当我把类似的代码放在下面的相同功能中时,我可以成功地运行它们:

int connect_n_getFloat(char *ip_addr, uint16_t addr, float *val){
int fail = 0;
modbus_t *ctx = modbus_new_tcp(ip_addr, MODBUS_SERVER_PORT);
ctxConfig(ctx);
if (modbus_connect(ctx) == 0) {
__uint16_t value[2];
if(modbus_read_registers(ctx, (addr-1), 2, value) > 0) {
*val = modbus_get_float_abcd(value);
} else {
fprintf(stderr, "Reading error(%d): %sn", addr, modbus_strerror(errno));
fail = -1;
}
} else {
fprintf(stderr, "Connection failed: %sn",
modbus_strerror(errno));
modbus_free(ctx);
fail = -1;
}
return fail;
}

您正在将上下文指针传递给connect函数,但应该将指针传递给指针,这样您就可以返回分配的上下文并在进一步的调用中继续使用它。

从更改函数签名和ctx用法

int connect(char *ip_addr, struct timeval timeout, modbus_t *ctx) {
int fail = 0;
ctx = modbus_new_tcp(ip_addr, MODBUS_SERVER_PORT);

int connect(char *ip_addr, struct timeval timeout, modbus_t **ctx) {
int fail = 0;
*ctx = modbus_new_tcp(ip_addr, MODBUS_SERVER_PORT);

这也解释了为什么当你把它们放在同一个函数中时它会起作用。

最新更新