嵌入式技术论坛
直播中

王璐

7年用户 490经验值
私信 关注
[问答]

在STM32H7上FreeModbus-TCP移植出错是何原因?如何解决

最近在STM32上搞ModbusTcp。LWIP已经调通了,但是在ENV开启Freemodbus功能之后,遇到了不少问题,所以想在这里请教一下大家:

1.jpg

1.我在ENV开启Freemodbus功能,TCP模式之后,发现下面的TCPsever自动开启了,这个我倒是能够理解,可能它们之间有依赖关系。但是为什么DFS功能也强制开启了呢?这个是为什么?

1.jpg

更诡异的是,这个功能一旦开启,就再也关不掉了:即便我关掉Freemodbus和TCPSever这两个包,这个DFS还是强制开启的,无法关闭!

1.jpg

2.第二个问题是:在ENV上把整个工程编译了之后,我发现KEIL工程会报错,解决了,然而继续编译又会出现问题:LWIP的代码,和POSIX的很多内容是重复的,不仅仅是变量,甚至是.h文件的名字都一样!这样导致编译的时候,c文件不知道引用的是哪个.h文件的内容,导致程序报错!

1.jpg

2.jpg

3.jpg

我研究了下LWIP的代码,也尝试过关掉LWIP_SOCKET_SELECT 和 LWIP_SOCKET_POLL这两个宏,但是没有解决问题,目前不知道这个问题该怎样解决,请各位大神帮帮忙吧!

1.jpg

回帖(5)

马占云

2022-10-18 10:27:17
想取消也容易,上下键高亮选中后,左右键切换到help

enter 进去看看是被谁选择了,然后先去关掉选择它的那个项,再回头取消这个
举报

王璐

2022-10-18 10:27:25
好的,感谢大神帮我解决了第一个问题。请问第二个问题,可以指点下吗?
举报

马占云

2022-10-18 10:27:32
第二个错误是编译 select.c 文件的时候有个不明确的类型 pollfd。
这个应该是缺少头文件路径,把 poll.h 头文件路径加进去就好了
举报

王璐

2022-10-18 10:28:15
真是太谢谢了,通过你的指点,这个第二个问题也解决了。借此机会,我想把解决步骤分享给大家:
首先是ENV上的这个FreeModbus软件包,里面的TCP模式代码,是不完整的:
1.打开freemodbus-v1.6.0文件下的SConscript文件,添加这样的配置,以把TCP相关的文件拷贝进来
1.jpg
2.把select.c的头文件包含:poll.h的尖括号改成引号,即:#include “poll.h”,不然这个头文件会报错(这也是我第一次真正体会到<>和””的区别)
2.jpg
3.官方的freemodbus-v1.6.0软件包,缺少porttcp.c文件。
把ENV下载下来的文件包,和github上的文件包相比对,把文件拷贝过去
1.jpg
4.对于tcpserver.c的报错,可以参照这个帖子解决:https://club.rt-thread.org/ask/question/f178c826b2702d6a.html
主要是添加2个头文件
1.jpg
在移植的过程中,我们可能看到很多重名的头文件,比如poll.h、errno.h。我发现这些个重名的文件应该是没有影响的:虽然说.h的名字是相同的,但是文件定义的宏名字是不同的(不过我还是希望RTT团队能够对此改进下,突然遇到这种情况确实让人困惑,还以为是自己操作出了问题):
1.jpg
主要的问题点是这个4个,也许会有一些小的遗漏,不过没有太大影响。。。说实话真心希望RTT团队能够加强对软件包的把关,不然用户总以为ENV下载下来的软件包一般不会有问题,一旦出现报错总以为是自己哪里配置出了问题,最终白白浪费了大量时间T_T
目前KEIL不报错了,程序的功能明天再来验证
举报

马占云

2022-10-18 10:28:23
可以PR个。
改好记得GCC也要测试下。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分