我正在尝试通过我的英特尔Galileo Gen2主板与ModBusRTU上的某些工业硬件进行通信。 我使用这块板将UART转换为RS485 http://linksprite.com/wiki/index.php5?title=RS485_Shield_V2.1_for_Arduino,我可以在Arduino(与2/3引脚上的SoftwareSerial)和Galileo(引脚0/1上的Serial1)之间串行通话。所以我知道RS485的链接正在运行。
使用Arduino Uno我可以使用ModBusRTU与我的设备通话,感谢这个库https://github.com/4-20ma/ModbusMaster
在伽利略的Gen2我receveid此警告“警告:库ModbusMaster声称在[AVR,SAM]架构(一个或多个)上运行,并且可以是与它运行在[i586的]架构(一个或多个)当前板不相容。 “因为不同的架构。
现在我正在尝试使用关于modbus的烹饪黑客教程和arduino,raspberry和galileo的rs485的例子,但我不能让它对我有用。我收到了大量的编译错误:
C:\英特尔\ Arduino的1.6.4 \库\ 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'中的任何一个都不匹配< / p>
在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) 编译错误。
有人让ModBus在Galileo Gen2上工作吗?
谢谢你, 醛
答案 0 :(得分:1)
失败的几个原因
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代码 - 稍后会进入
您抱怨的最后一个错误是编译器的候选者找出使用哪种方法。它归结为使用“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到期 - 我现在正要测试它,看看这是否足以让这件事发生:) ...确认; Arduino Due上预期的功能 - 对于Intel Gallileo应该是相同的