搜索
bottom↓
回复: 15

W5500 TCP模式下,断开后不能重连!!!

[复制链接]

出5入10汤圆

发表于 2016-5-9 16:33:52 | 显示全部楼层 |阅读模式
我将W5500 配置在TCP Sever模式,当与电脑建立连接,通讯没有问题,待机一段时间之后,在此通讯提示失败;无法重新建立连接,   

这是我打印的寄存器的值,Sn_SR1为0x17表示连接已建立,实际上连接早已断开,并且我设置Sn_KPALVTR = 0x0a;即50s发送一次心跳包;实践监控没有发现W5500 发送任何心跳包,不知道是不是我哪里设置出现的问题?望坛友赐教

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2016-5-9 16:48:00 | 显示全部楼层
无图无真相啊的

出5入10汤圆

 楼主| 发表于 2016-5-9 16:56:08 | 显示全部楼层
顶一下~~~

出0入0汤圆

发表于 2016-5-9 17:00:56 | 显示全部楼层
顶一下~~~

出5入10汤圆

 楼主| 发表于 2016-5-12 08:55:23 | 显示全部楼层
必须进行一次完整的通讯之后,才会发送心跳包~~~

出0入89汤圆

发表于 2016-5-12 09:06:26 | 显示全部楼层
你这个问题没法回答,什么都没有,估计大神也没办法

出5入10汤圆

 楼主| 发表于 2016-5-13 09:14:07 | 显示全部楼层
youkebing 发表于 2016-5-12 09:06
你这个问题没法回答,什么都没有,估计大神也没办法

已解决了。。。。是我没有进行一次完整的收发通讯

出330入0汤圆

发表于 2016-8-2 14:25:05 | 显示全部楼层
发现winnet的开发包有问题,非得服务器先开监听,然后客户端才能连上。
但实际上,很多时候很多场合,是客户端先开,服务器后开。
为此,我改造了下它的一个函数,问题才得到解决。

出0入0汤圆

发表于 2016-8-3 00:11:46 | 显示全部楼层
while加上这句:
W5500_Write1Bye(W5500_Sn_CR, CR_SEND_KEEP, (VDM|RWB_WRITE|S0_REG));  //发送心跳包检查端口的连接状态,否则意外断开不会产生超时中断,必须在成功发送一次数据后才会发送心跳包。

出0入0汤圆

发表于 2017-9-6 13:51:06 | 显示全部楼层
zcllom 发表于 2016-8-2 14:25
发现winnet的开发包有问题,非得服务器先开监听,然后客户端才能连上。
但实际上,很多时候很多场合,是客 ...

你是怎么解决的,可以告诉小弟么?

出330入0汤圆

发表于 2017-9-6 14:37:23 来自手机 | 显示全部楼层
applededipan 发表于 2017-9-6 13:51
你是怎么解决的,可以告诉小弟么?

等我开了电脑再回复

出0入0汤圆

发表于 2017-9-6 15:32:41 | 显示全部楼层
客户端有retry机制就可以了

TCPserver本来就是要侦听的,否则为什么还叫server端

出0入0汤圆

发表于 2017-9-6 19:00:31 | 显示全部楼层
zcllom 发表于 2017-9-6 14:37
等我开了电脑再回复

多谢多谢多谢多谢多谢

出330入0汤圆

发表于 2017-9-6 22:20:51 | 显示全部楼层
本帖最后由 zcllom 于 2017-9-6 22:24 编辑
applededipan 发表于 2017-9-6 19:00
多谢多谢多谢多谢多谢


在官方的SOCKET.C中有这样一个函数 connect(uint8_t sn, uint8_t * addr, uint16_t port)
它里面
while(getSn_SR(sn) != SOCK_ESTABLISHED)
{
        if (getSn_IR(sn) & Sn_IR_TIMEOUT)
        {
                setSn_IR(sn, Sn_IR_TIMEOUT);
                //#if _WIZCHIP_ == 5200   // for W5200 ARP errata
                //setSUBR((uint8_t*)"\x00\x00\x00\x00");
                //#endif
                return SOCKERR_TIMEOUT;
        }

}
本来连接不上服务器,或者掉线或者服务器没开,应该可以return SOCKERR_TIMEOUT超时返回,但不知道什么原因,程序进入到这个while中,无法顺理成章地满足if的条件,就这样无法返回,套在死循环中。
因此我在去connect服务器之前,开启定时器计时,一旦陷进去了,程序阻塞了。这时候只有定时器中断还能继续计时,到了一定的时间之后,置一个全局标志位,在那个while中用if判断这个标志位是否置位(也就是不要原装的那个判断),如果置位就返回SOCKERR_TIMEOUT。然后干别的事情,过会再来connect,等网络恢复了,总能connect成功。这样比死在while中,网络恢复了还出不来要强很多吧。

出0入0汤圆

发表于 2017-9-7 07:59:41 | 显示全部楼层
zcllom 发表于 2017-9-6 22:20
在官方的SOCKET.C中有这样一个函数 connect(uint8_t sn, uint8_t * addr, uint16_t port)
它里面
while(g ...

多谢!我试试!!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 15:13

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表