【发布时间】:2022-09-28 18:42:55
【问题描述】:
我正在尝试将 libmodbus 下的操作分组为 Mod-bus 连接和获取值到两个更简单的函数中,如下所示。
但是,当我尝试从设备中获取价值时,它总是会导致Segmentation fault (core dumped)。(get_float,modbus_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: %s\\n\",
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(\"1\\n\");
fail = modbus_read_registers(ctx, (addr-1), 2, value);
printf(\"2\\n\");
if(fail <= 0) {
fprintf(stderr, \"Reading error(%d): %s\\n\", 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): %s\\n\", addr, modbus_strerror(errno));
fail = -1;
}
} else {
fprintf(stderr, \"Connection failed: %s\\n\",
modbus_strerror(errno));
modbus_free(ctx);
fail = -1;
}
return fail;
}