0

我正在尝试通过我的 Intel Galileo Gen2 板与 ModBusRTU 上的一些工业硬件进行通信。我使用此板将 UART 转换为 RS485 http://linksprite.com/wiki/index.php5?title=RS485_Shield_V2.1_for_Arduino并且我可以在 Arduino(在引脚 2/3 上使用 SoftwareSerial)和 Galileo(在 Serial1 上引脚 0/1)。所以我知道 RS485 的链接是有效的。

借助 Arduino Uno,我可以使用 ModBusRTU 与我的设备交谈,这要归功于这个库https://github.com/4-20ma/ModbusMaster

在 galileo gen2 上,我收到此警告“警告:库 ModbusMaster 声称在 [avr, sam] 架构上运行,并且可能与在 [i586] 架构上运行的当前板不兼容。”因为不同的架构.

现在我正在尝试为arduino、覆盆子和伽利略使用关于modbus和rs485的cooking hack教程示例,但我无法让它对我有用。我收到了大量的编译错误,如下所示:

C:\Intel\arduino-1.6.4\libraries\ModBusMaster485\ModbusMaster485.cpp:在成员函数'uint8_t ModbusMaster485::ModbusMasterTransaction(uint8_t)'中:C:\Intel\arduino-1.6.4\libraries\ModBusMaster485\ModbusMaster485。 cpp:701:50: 错误: '_crc16_update' 未在此范围内声明

C:\Intel\arduino-1.6.4\libraries\ModBusMaster485\ModbusMaster485.cpp:814:52: 错误: '_crc16_update' 未在此范围内声明

C:\Intel\arduino-1.6.4\libraries\ModBusMaster485\ModbusMaster485.cpp:在全局范围内:

C:\Intel\arduino-1.6.4\libraries\ModBusMaster485\ModbusMaster485.cpp:881:14: 错误:'unsigned int ModbusMaster485::makeWord(unsigned int)' 的原型与类 'ModbusMaster485' 中的任何内容都不匹配

在 C:\Intel\arduino-1.6.4\libraries\ModBusMaster485\ModbusMaster485.cpp:25:0: C:\Intel\arduino-1.6.4\libraries\ModBusMaster485\ModbusMaster485.h:302:11 中包含的文件中:错误:候选者是:uint16_t ModbusMaster485::makeWord(uint8_t, uint8_t)

C:\Intel\arduino-1.6.4\libraries\ModBusMaster485\ModbusMaster485.h:301:14: 错误:uint16_t ModbusMaster485::makeWord(uint16_t) C:\Intel\arduino-1.6.4\libraries\ModBusMaster485\ModbusMaster485。 cpp:887:14: 错误: 'unsigned int ModbusMaster485::makeWord(uint8_t, uint8_t)' 的原型与类 'ModbusMaster485' 中的任何内容都不匹配

在 C:\Intel\arduino-1.6.4\libraries\ModBusMaster485\ModbusMaster485.cpp:25:0: C:\Intel\arduino-1.6.4\libraries\ModBusMaster485\ModbusMaster485.h:302:11 中包含的文件中:错误:候选是:uint16_t ModbusMaster485::makeWord(uint8_t, uint8_t) C:\Intel\arduino-1.6.4\libraries\ModBusMaster485\ModbusMaster485.h:301:14: error: uint16_t ModbusMaster485::makeWord(uint16_t) 编译错误.

有人让 ModBus 在 Galileo Gen2 上工作吗?

谢谢你,阿尔多

4

1 回答 1

1

失败的几个原因

  • crc16库代码

ModbusMaster485 代码假定使用了 avr 头文件 util/crc16.h 文件——事实上,如果你仔细查看完整的 avr 汇编指令——第一步是删除这种依赖关系。

--- ModbusMaster485.h.orig  2015-09-28 13:55:48.000000000 +0200
+++ ModbusMaster485.h   2015-09-28 13:56:00.000000000 +0200
@@ -92,7 +92,7 @@

 /* _____PROJECT INCLUDES_____________________________________________________ */
 // functions to calculate Modbus Application Data Unit CRC
-#include <util/crc16.h>
+//#include <util/crc16.h>

当然; 您需要在 C 中提供相关的 crc16 代码 - 稍后会介绍

  • sizeof(int) != 16,实际上是 32

您遇到的最后一个错误抱怨编译器的候选者确定使用哪种方法。它归结为使用“unsigned int”而不是“uint16_t” - 因此,一个简单的更改,您还需要添加引用的缺少的 crc16 函数。

--- ModbusMaster485.cpp.orig    2015-09-12 04:35:05.000000000 +0200
+++ ModbusMaster485.cpp 2015-09-28 13:56:54.000000000 +0200
@@ -29,7 +29,22 @@

 /* _____PROJECT INCLUDES_____________________________________________________ */

+uint16_t
+_crc16_update(uint16_t crc, uint8_t a)
+{
+    int i;

+    crc ^= a;
+    for (i = 0; i < 8; ++i)
+    {
+        if (crc & 1)
+            crc = (crc >> 1) ^ 0xA001;
+        else
+            crc = (crc >> 1);
+    }
+
+    return crc;
+}

 /* _____PUBLIC FUNCTIONS_____________________________________________________ */

@@ -878,13 +893,13 @@
 }


-unsigned int ModbusMaster485::makeWord(unsigned int w)
+uint16_t ModbusMaster485::makeWord(uint16_t w)
 {
    return w;
 }


-unsigned int ModbusMaster485::makeWord(uint8_t h, uint8_t l)
+uint16_t ModbusMaster485::makeWord(uint8_t h, uint8_t l)
 {
    return (h << 8) | l;
 }

你现在应该可以编译项目了:)

我什至必须这样做才能在 Arduino Due 上编译项目 - 我现在正要测试它,看看这是否足以让这种情况发生:) ...确认;Arduino Due 上的预期功能 - 应该与 Intel Gallileo 相同

于 2015-09-28T12:38:29.413 回答