我已经基于libmodbus库(v3.1.4)中的示例(unit-test-server.c)编写了自己的Modbus从站。但是,由于一个我不知道如何解决的问题而无法使用:modbus_mapping_new()函数似乎正在为错误的数据分配内存?
这就是我正在做的,根据documentation,这应该为7个保持寄存器分配内存:
mb_mapping = modbus_mapping_new(0, 0, 7, 0);
这实际上是怎么回事:
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个保持寄存器分配内存。
答案 0 :(得分:0)
我只是在MacBook上运行程序,所以一切正常! modbus_mapping_new()为寄存器分配内存(在这种情况下为500),而Modbus主站正在从我的从站检索正确的值。
我猜这意味着代码与我最初运行代码的Nvidia Jetson TX2的CPU架构有问题吗?如何解决这个问题,使其也可以在Jetson上正确运行?
奇怪的是,几个月前,我曾经在Jetson上运行过完全相同的代码。我完全不知道可能会发生什么变化...
[编辑]
我终于弄清楚了:libmodbus版本似乎有点混乱。虽然LIBMODBUS_VERSION_STRING变量包含最新版本“ 3.1.4”,但也通过Ubuntu数据包源安装了libmodbus 3.0.6。我从系统中清除了后者,并从官方git仓库重新安装了libmodbus 3.1.4。现在一切正常。