【问题标题】:Separate connect function for libmodbuslibmodbus 的独立连接函数
【发布时间】:2022-09-28 18:42:55
【问题描述】:

我正在尝试将 libmodbus 下的操作分组为 Mod-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;
}

    标签: c libmodbus


    【解决方案1】:

    您正在将上下文指针传递给连接函数,但应该传递一个指向指针的指针,因此您可以返回分配的上下文并在进一步的调用中继续使用它。

    更改函数签名和 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);
    

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

    【讨论】:

      猜你喜欢
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-12
      • 2020-11-08
      相关资源
      最近更新 更多