0

我正在尝试将libmodbusMod-bus 连接和获取值下的操作分组为两个更简单的函数,如下所示。
但是,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: %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;
}
4

0 回答 0