|
发表于 2017-9-6 22:20:51
|
显示全部楼层
本帖最后由 zcllom 于 2017-9-6 22:24 编辑
在官方的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中,网络恢复了还出不来要强很多吧。 |
|