首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >libmodbus的独立连接函数

libmodbus的独立连接函数
EN

Stack Overflow用户
提问于 2021-12-24 01:34:00
回答 1查看 57关注 0票数 0

我试图将Mod总线连接的操作分组到libmodbus下,并将值分成两个简单的函数,如下所示。

然而,当我试图从设备中获得价值时,它总是会导致Segmentation fault (core dumped)。(get_floatmodbus_read_registers)

有人能告诉我怎么修吗?

代码语言:javascript
运行
复制
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;
}
代码语言:javascript
运行
复制
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;
}

此外,当我将类似的代码放在下面的函数中时,我可以成功地运行它们:

代码语言:javascript
运行
复制
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;
}
EN

回答 1

Stack Overflow用户

发布于 2022-09-28 10:42:55

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

更改函数签名和ctx使用情况。

代码语言:javascript
运行
复制
int connect(char *ip_addr, struct timeval timeout, modbus_t *ctx) {
    int fail = 0;
    ctx = modbus_new_tcp(ip_addr, MODBUS_SERVER_PORT);

代码语言:javascript
运行
复制
int connect(char *ip_addr, struct timeval timeout, modbus_t **ctx) {
    int fail = 0;
    *ctx = modbus_new_tcp(ip_addr, MODBUS_SERVER_PORT);

这也解释了当您将它们放在相同的函数中时,它为什么会工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70468841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档