首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有人在Galileo 2上使用ModBus RTU吗?

有人在Galileo 2上使用ModBus RTU吗?
EN

Stack Overflow用户
提问于 2015-08-17 20:14:09
回答 1查看 506关注 0票数 0

我正在尝试从我的英特尔伽利略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上工作?

谢谢你,奥尔多

EN

回答 1

Stack Overflow用户

发布于 2015-09-28 20:38:29

失败的几个原因

  • crc16库代码

ModbusMaster485代码假定使用了AVR头文件util/crc16.h文件--实际上,如果仔细观察充满了avr汇编指令的话--第一步就是删除这种依赖。

代码语言:javascript
运行
复制
--- 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函数。

代码语言:javascript
运行
复制
--- 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相同

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32050115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档