Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
libmodbus
SAL
wiznet
wiznet与libmodbus软件包衔接对接SAL层传参问题
发布于 2020-12-28 13:50:13 浏览:1461
订阅该版
如下图,这两个软件包加载后网络无法通讯,log提示“[2020-12-25 18:47:35.030 R]WIZnet socket (0) not support option name : 4.”,如果将wiz_setsockopt这个函数屏蔽,能否通讯,但是会出各种古怪问题,比如有时候会崩溃。 如何才能用wizchip_setsockopt,如何传参。 既然这两个软件包都是RTT维护,这块究竟该咋弄,RTT不能给个具体的说明吗? 有经过测试吗?     
查看更多
4
个回答
默认排序
按发布时间排序
杰瑞鼠
2020-12-29
2022龙腾虎跃,如虎添翼
 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
这家伙很懒,什么也没写!
同样的问题...心好累
撰写答案
登录
注册新账号
关注者
0
被浏览
1.5k
关于作者
杰瑞鼠
2022龙腾虎跃,如虎添翼
提问
172
回答
134
被采纳
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
机器人操作系统 (ROS2) 和 RT-Thread 通信
4
五分钟玩转RT-Thread新社区
5
国产MCU移植系列教程汇总,欢迎查看!
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
RT-Thread 中的 Github Actions
2
RT-Thread 学习笔记:memheap 死机问题的分析与解决
3
pkgs --update 踩坑记录
4
没有menuconfig的bsp如何添加.config Kconfig
5
开源之夏 2023 | RT-Thread 邀你参与开源,项目奖金最高达12000元!
热门标签
RT-Thread Studio
串口
LWIP
Env
SPI
AT
FinSH
ART-Pi
Bootloader
CAN总线
Hardfault
文件系统
USB
DMA
RT-Thread
线程
SCons
RT-Thread Nano
stm32
MQTT
ESP8266
ota
RTC
WIZnet_W5500
rt-smart
UART
flash
rtthread
packages_软件包
freemodbus
潘多拉开发板_Pandora
I2C
cubemx
FAL
定时器
PWM
BSP
AB32VG1
ADC
中断
消息队列_msg_queue
SDIO
msh
keil
Debug
socket
SFUD
LVGL
编译报错
C++_cpp
本月问答贡献
宇宙码蚁
11
个答案
3
次被采纳
rcp
9
个答案
3
次被采纳
张世争
24
个答案
2
次被采纳
用户名由3_15位
3
个答案
2
次被采纳
出出啊
3
个答案
2
次被采纳
本月文章贡献
IcyFeather
4
篇文章
9
次点赞
chejia12
4
篇文章
1
次点赞
燕十三
3
篇文章
22
次点赞
dejavudwh
3
篇文章
5
次点赞
zhjylzh
3
篇文章
4
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部