我正试图从我的英特尔伽利略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上,我收到这个警告"警告:库ModbusMaster声称运行在[avr, sam]架构上,可能与当前运行在[i586]架构上的主板不兼容。"因为不同的架构。
现在我正试图使用烹饪黑客的教程的例子modbus和rs485的arduino,覆盆子和伽利略,但我不能使它为我工作。我收到了大量的编译错误,像这样:
C:Intelarduino-1.6.4librariesModBusMaster485 ModBusMaster485 .cpp: In member function 'uint8_t ModBusMaster485::ModbusMasterTransaction(uint8_t)':C:Intelarduino-1.6.4librariesModBusMaster485 ModBusMaster485 .cpp:701:50: error: '_crc16_update'未在此范围内声明
C:Intelarduino-1.6.4librariesModBusMaster485 ModBusMaster485 .cpp:814:52: error: '_crc16_update'未在此作用域声明
C:Intelarduino-1.6.4librariesModBusMaster485 ModBusMaster485 .cpp: At global scope:
C:Intelarduino-1.6.4librariesModBusMaster485 ModBusMaster485 .cpp:881:14:错误:原型'unsigned int ModBusMaster485::makeWord(unsigned int)'不匹配任何类' ModBusMaster485 '
从C:Intelarduino-1.6.4librariesModBusMaster485 ModBusMaster485 .cpp:25:0:C:Intelarduino-1.6.4librariesModBusMaster485 ModBusMaster485 .h:302:11:错误:候选人是:uint16_t ModBusMaster485::makeWord(uint8_t, uint8_t)
C:Intelarduino-1.6.4librariesModBusMaster485 ModBusMaster485 .h:301:14: error: uint16_t ModBusMaster485::makeWord(uint16_t)C:Intelarduino-1.6.4librariesModBusMaster485 ModBusMaster485 .cpp:887:14:错误:原型'unsigned int ModBusMaster485::makeWord(uint8_t, uint8_t)'不匹配任何类' ModBusMaster485 '
从C:Intelarduino-1.6.4librariesModBusMaster485 ModBusMaster485 .cpp:25:0:C:Intelarduino-1.6.4librariesModBusMaster485 ModBusMaster485 .h:302:11:错误:候选人是:uint16_t ModBusMaster485::makeWord(uint8_t, uint8_t)C:Intelarduino-1.6.4librariesModBusMaster485 ModBusMaster485 .h:301:14: error: uint16_t ModBusMaster485::makeWord(uint16_t)编译错误。
有人得到ModBus工作在伽利略Gen2?
谢谢你,奥尔多
失败的几个原因
- 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 galileo