Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
libmodbus
SAL
wiznet
wiznet与libmodbus软件包衔接对接SAL层传参问题
发布于 2020-12-28 13:50:13 浏览:2040
订阅该版
如下图,这两个软件包加载后网络无法通讯,log提示 ``` “[2020-12-25 18:47:35.030 R]WIZnet socket (0) not support option name : 4.” ``` 如果将`wiz_setsockopt`这个函数屏蔽,能否通讯,但是会出各种古怪问题,比如有时候会崩溃。 如何才能用wizchip_setsockopt,如何传参。 既然这两个软件包都是RTT维护,这块究竟该咋弄,RTT不能给个具体的说明吗? 有经过测试吗? ![image.png](/uploads/20201228/f10fe6b61736e18b979db8c18173d06d.png) ![image.png](/uploads/20201228/775fa2055e5e97724743431797f8c2ec.png) ![image.png](/uploads/20201228/9cf54fdc4fd652266543af5bf8956730.png) ![image.png](/uploads/20201229/23b3e902cd3673210aacef6d3c29c3ac.png) ![image.png](/uploads/20201229/1c91eaa269873127a92157cf1bf36297.png)
查看更多
5
个回答
默认排序
按发布时间排序
杰瑞鼠
2020-12-29
2024龙行天下
![image.png](/uploads/20201229/e2846b7f607a089b9fd45156b77ce4fe.png) RTT宣称的sal架构,支持w5500,你们就不能用lidmodbus和wiznet快速搭建一个modbustcp的测试平台验证一下这两个包的sal衔接究竟有没有问题? 反馈这么久,一直得不到官方反馈,太桑心了
xiangxistu
2020-12-29
这家伙很懒,什么也没写!
可以看看这个参数的意义,不知道如何处理,建议看 lwip 中的实现; ``` #define SO_REUSEADDR 0x0004 /* Allow local address reuse */ ``` 这个就是导致错误的原因,wiznet 的 setsockopt 函数实现了常用的参数的解析处理,不过很遗憾没有实现对这个参数的解析; 在下面的代码中,也可以留意到 lwip 中并不是每一个参数都会完完整整的解析,所以说这个问题的解决有两个方案: 1. 修改 wiznet 中的代码,添加上这个参数的处理。 2. 修改 libmodbus 中代码,去掉 TCP 的这个传输特性。 如果楼主顺利解决了问题,可以向 package 仓库提交代码,方便更多的人使用。 ``` int lwip_setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen) { struct lwip_sock *sock = get_socket(s); err_t err = ERR_OK; struct lwip_setgetsockopt_data data; if (!sock) { return -1; } if (NULL == optval) { sock_set_errno(sock, EFAULT); return -1; } /* Do length and type checks for the various options first, to keep it readable. */ switch (level) { /* Level: SOL_SOCKET */ case SOL_SOCKET: switch (optname) { case SO_BROADCAST: /* UNIMPL case SO_DEBUG: */ /* UNIMPL case SO_DONTROUTE: */ case SO_KEEPALIVE: /* UNIMPL case case SO_CONTIMEO: */ #if LWIP_SO_SNDTIMEO case SO_SNDTIMEO: #endif /* LWIP_SO_SNDTIMEO */ #if LWIP_SO_RCVTIMEO case SO_RCVTIMEO: #endif /* LWIP_SO_RCVTIMEO */ #if LWIP_SO_RCVBUF case SO_RCVBUF: #endif /* LWIP_SO_RCVBUF */ /* UNIMPL case SO_OOBINLINE: */ /* UNIMPL case SO_SNDBUF: */ /* UNIMPL case SO_RCVLOWAT: */ /* UNIMPL case SO_SNDLOWAT: */ #if SO_REUSE case SO_REUSEADDR: case SO_REUSEPORT: #endif /* SO_REUSE */ /* UNIMPL case SO_USELOOPBACK: */ if (optlen < sizeof(int)) { err = EINVAL; } break; case SO_NO_CHECK: if (optlen < sizeof(int)) { err = EINVAL; } #if LWIP_UDP if ((sock->conn->type != NETCONN_UDP) || ((udp_flags(sock->conn->pcb.udp) & UDP_FLAGS_UDPLITE) != 0)) { /* this flag is only available for UDP, not for UDP lite */ err = EAFNOSUPPORT; } #endif /* LWIP_UDP */ break; default: LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, SOL_SOCKET, UNIMPL: optname=0x%x, ..)\n", s, optname)); err = ENOPROTOOPT; } /* switch (optname) */ break; /* Level: IPPROTO_IP */ case IPPROTO_IP: switch (optname) { /* UNIMPL case IP_HDRINCL: */ /* UNIMPL case IP_RCVDSTADDR: */ /* UNIMPL case IP_RCVIF: */ case IP_TTL: case IP_TOS: if (optlen < sizeof(int)) { err = EINVAL; } break; #if LWIP_IGMP case IP_MULTICAST_TTL: if (optlen < sizeof(u8_t)) { err = EINVAL; } if (NETCONNTYPE_GROUP(sock->conn->type) != NETCONN_UDP) { err = EAFNOSUPPORT; } break; case IP_MULTICAST_IF: if (optlen < sizeof(struct in_addr)) { err = EINVAL; } if (NETCONNTYPE_GROUP(sock->conn->type) != NETCONN_UDP) { err = EAFNOSUPPORT; } break; case IP_MULTICAST_LOOP: if (optlen < sizeof(u8_t)) { err = EINVAL; } if (NETCONNTYPE_GROUP(sock->conn->type) != NETCONN_UDP) { err = EAFNOSUPPORT; } break; case IP_ADD_MEMBERSHIP: case IP_DROP_MEMBERSHIP: if (optlen < sizeof(struct ip_mreq)) { err = EINVAL; } if (NETCONNTYPE_GROUP(sock->conn->type) != NETCONN_UDP) { err = EAFNOSUPPORT; } break; #endif /* LWIP_IGMP */ default: LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IP, UNIMPL: optname=0x%x, ..)\n", s, optname)); err = ENOPROTOOPT; } /* switch (optname) */ break; #if LWIP_TCP /* Level: IPPROTO_TCP */ case IPPROTO_TCP: if (optlen < sizeof(int)) { err = EINVAL; break; } /* If this is no TCP socket, ignore any options. */ if (sock->conn->type != NETCONN_TCP) return 0; switch (optname) { case TCP_NODELAY: case TCP_KEEPALIVE: #if LWIP_TCP_KEEPALIVE case TCP_KEEPIDLE: case TCP_KEEPINTVL: case TCP_KEEPCNT: #endif /* LWIP_TCP_KEEPALIVE */ break; default: LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, UNIMPL: optname=0x%x, ..)\n", s, optname)); err = ENOPROTOOPT; } /* switch (optname) */ break; #endif /* LWIP_TCP */ #if LWIP_UDP && LWIP_UDPLITE /* Level: IPPROTO_UDPLITE */ case IPPROTO_UDPLITE: if (optlen < sizeof(int)) { err = EINVAL; break; } /* If this is no UDP lite socket, ignore any options. */ if (sock->conn->type != NETCONN_UDPLITE) return 0; switch (optname) { case UDPLITE_SEND_CSCOV: case UDPLITE_RECV_CSCOV: break; default: LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_UDPLITE, UNIMPL: optname=0x%x, ..)\n", s, optname)); err = ENOPROTOOPT; } /* switch (optname) */ break; #endif /* LWIP_UDP && LWIP_UDPLITE */ /* UNDEFINED LEVEL */ default: LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, level=0x%x, UNIMPL: optname=0x%x, ..)\n", s, level, optname)); err = ENOPROTOOPT; } /* switch (level) */ if (err != ERR_OK) { sock_set_errno(sock, err); return -1; } /* Now do the actual option processing */ data.sock = sock; #ifdef LWIP_DEBUG data.s = s; #endif /* LWIP_DEBUG */ data.level = level; data.optname = optname; data.optval = (void*)optval; data.optlen = &optlen; data.err = err; tcpip_callback(lwip_setsockopt_internal, &data); sys_arch_sem_wait(&sock->conn->op_completed, 0); /* maybe lwip_setsockopt_internal has changed err */ err = data.err; sock_set_errno(sock, err); return err ? -1 : 0; } ```
adminmin
2021-03-09
这家伙很懒,什么也没写!
请问有没有解决,遇到同样的问题,报错,重连不上,根本没办法用在项目上。
沙滩
2022-07-19
这家伙很懒,什么也没写!
同样的问题...心好累
saviourxx
2024-08-21
这家伙很懒,什么也没写!
![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240821/374d5a15c18fb8f4325d1fd28d6d2168.png.webp) 错误一个解决完又一个,我也很心累
撰写答案
登录
注册新账号
关注者
0
被浏览
2k
关于作者
杰瑞鼠
2024龙行天下
提问
203
回答
153
被采纳
4
关注TA
发私信
相关问题
1
SAL 不支持 PF_PACKET,如何修改可以支持?
2
socket(AF_INET, SOCK_RAW, IPPROTO_UDP);
3
SAL组件好像并不支持DTLS
4
添加SAL组件后socket相关函数均提示declared implicitly
5
sal组件socket等函数无法使用
6
SAL关闭自带的一个socket连接
7
sal验证link.rt-thread.org:8101失败
8
请问 AT-SAL,recv() 函数在服务端断开之后没有返回,是设计如此吗?
9
多网卡的出现创建socket失败
10
SAL的TLS功能是单向认证,有大神做过改动改为双向认证的吗?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
嵌入式大赛Top10排名公布!作品共赏,看大奖花落谁家!
2
基于开源操作系统的融合创新:睿赛德科技荣获汽车操作系统TOP10
3
k230运行rt-smart
4
RT-Thread SCons上手指北
5
CAN调试过程曲折不断,记录调试过程的问题和解决方法。
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
ART-Pi
FinSH
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
flash
packages_软件包
cubemx
PWM
freemodbus
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
rt_mq_消息队列_msg_queue
keil_MDK
C++_cpp
SFUD
ulog
at_device
本月问答贡献
出出啊
1515
个答案
342
次被采纳
小小李sunny
1438
个答案
289
次被采纳
张世争
786
个答案
169
次被采纳
crystal266
546
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
6
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
2
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部