我已经根据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个保持寄存器分配内存。
最佳答案
我只是在我的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。现在一切正常。