我正在尝试从我的英特尔伽利略Gen2板上的ModBusRTU上与一些工业硬件通信。我使用这块板将UART转换为RS485 http://linksprite.com/wiki/index.php5?title=RS485_Shield_V2.1_for_Arduino,并且我可以在Arduino ( SoftwareSerial在引脚2/3)和伽利略( Serial1在引脚0/1)之间串行通信。所以我知道RS485的连接正常。
有了Arduino Uno,多亏了这个库https://github.com/4-20ma/ModbusMaster,我可以使用ModBusRTU与我的设备进行对话
在galileo gen2上,我收到了这样的警告:“警告: library ModbusMaster声称运行在avr,sam架构上,并且可能与您当前运行在i586架构上的主板不兼容。”因为不同的架构。
现在我正试着在arduino,raspberry和galileo上使用关于modbus和rs485的烹饪hack教程的例子,但是我不能让它为我工作。我收到了大量这样的编译错误:
成员函数‘C:\Intel\arduino-1.6.4\libraries\ModBusMaster485\ModbusMaster485.cpp: ModbusMaster485::ModbusMasterTransaction(uint8_t)':C:\Intel\arduino-1.6.4\libraries\ModBusMaster485\ModbusMaster485.cpp:701:50: error:'_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:错误:无符号整数ModbusMaster485::makeWord(uint8_t,uint8_t) C:\Intel\arduino-1.6.4\libraries\ModBusMaster485\ModbusMaster485.cpp:887:14:错误:‘uint16_t 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:错误: uint16_t ModbusMaster485::makeWord(uint16_t)错误编译。
有没有人让ModBus在伽利略Gen2上工作?
谢谢你,奥尔多
发布于 2015-09-28 20:38:29
失败的几个原因
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上的预期功能-应与英特尔Gallileo相同
https://stackoverflow.com/questions/32050115
复制相似问题