代码之家  ›  专栏  ›  技术社区  ›  ci7i2en4

libmodbus:modbus_mapping_new()工作不正常?

  •  1
  • ci7i2en4  · 技术社区  · 6 年前

    我已经根据libmodbus库(v3.1.4)中的示例(unit test server.c)编写了自己的modbus slave。但是,由于一个我不知道如何解决的问题,它无法工作:modbus_mapping_new()函数似乎正在为错误的数据分配内存?

    这就是我要做的,根据 documentation 这应该为7个保持寄存器分配内存:

    mb_mapping=modbus_mapping_new(0,0,7,0);
    < /代码> 
    
    

    实际情况是:

    printf(“nb_bits=%d\start_bits=%d\n nb_输入_bits=%d\start_输入_bits=%d\n nb_输入_寄存器=%d\start_输入_寄存器=%d\n nb_寄存器=%d\n\start_寄存器=%d\n”,mb_映射->nb_bits,MB_映射->开始_bits,MB_映射->nb_输入_bits,MB_映射->开始_输入_bits,MB_映射-&u bits,MB_映射-&U映射-&u bits,MB _映射-&U映射-&U gt;nb_输入寄存器,mb_映射->启动_input_寄存器,mb_mapping->nb_寄存器,mb_mapping->启动_寄存器);//调试输出
    < /代码> 
    
    

    ^^这些是可以在modbus_mapping_t structure中设置的所有值。

    如果这里有任何熟悉libmodbus库的人:我是否误解了文档或这里发生了什么?

    现在,我得到一个segfault,因为modbus_mapping_new()没有为我要写入的7个保持寄存器分配内存。

    这就是我要做的,根据documentation这应该为7个保持寄存器分配内存:

    mb_mapping = modbus_mapping_new(0, 0, 7, 0);
    

    实际情况是:

    enter image description here

    printf("NB_BITS = %d\nSTART_BITS = %d\nNB_INPUT_BITS = %d\nSTART_INPUT_BITS = %d\nNB_INPUT_REGISTERS = %d\nSTART_INPUT_REGISTERS = %d\nNB_REGISTERS = %d\nSTART_REGISTERS = %d\n", mb_mapping->nb_bits, mb_mapping->start_bits, mb_mapping->nb_input_bits, mb_mapping->start_input_bits, mb_mapping->nb_input_registers, mb_mapping->start_input_registers, mb_mapping->nb_registers, mb_mapping->start_registers); // DEBUG OUTPUT
    

    ^^这些都是可以在modbus_mapping_t structure.

    如果这里有任何熟悉libmodbus库的人:我是否误解了文档或这里发生了什么?

    现在我得到一个segfault,因为modbus_mapping_new()没有为我正在写入的7个保持寄存器分配内存。

    1 回复  |  直到 6 年前
        1
  •  0
  •   ci7i2en4    6 年前

    我只是在我的MacBook上运行我的程序,一切都非常好!modbus_mapping_new()为寄存器(在本例中为500)分配内存,modbus masters正在从我的slave检索正确的值。

    我想这意味着代码与我最初运行代码的Nvidia Jetson TX2的CPU架构有问题吗?!我该如何解决这个问题,以便它也能在Jetson上正确运行?

    奇怪的是,几个月前,我有一次在Jetson上运行完全相同的代码。我完全不知道会发生什么变化…

    [编辑] < /P>

    我终于弄明白了:不知怎么的,libmodbus版本似乎混淆了。虽然libmodbus_version_string变量包含最新版本的“3.1.4”,但也通过Ubuntu数据包源安装了libmodbus 3.0.6。我从系统中清除了后者,并从正式的Git存储库中重新安装了libmodbus 3.1.4。现在一切都正常了。

    Modbus主机正在从我的从机检索正确的值。

    enter image description here

    我想这意味着代码与我最初运行代码的Nvidia Jetson TX2的CPU架构有问题吗?!我该如何解决这个问题,以便它也能在Jetson上正确运行?

    奇怪的是,几个月前,我有一次在Jetson上运行完全相同的代码。我完全不知道会发生什么变化…

    [编辑]

    我终于弄明白了:不知怎么的,libmodbus版本似乎混淆了。虽然libmodbus_version_string变量包含最新版本的“3.1.4”,但也通过Ubuntu数据包源安装了libmodbus 3.0.6。我从系统中清除了后者,并从正式的Git存储库中重新安装了libmodbus 3.1.4。现在一切正常。