|
楼主 |
发表于 2011-3-24 16:39:39
|
显示全部楼层
代码实现大概如下:
//TCP
int TCP_step(p_dlrcp p)
{
static int itry=0;
switch (p->chl->ste)
{
default: //----------------------------------------
p->ste = DLRCP_S_IDLE;
if (chl_Bind(p->chl, p->chl->type, p->chlid, OS_TICK_MS) != SYS_R_OK)
os_thd_Slp1Tick();
p->chl->ste = CHL_S_STANDBY;
p->cnt = 0;
break;
case CHL_S_STANDBY://-----------------------------------------
if (modem_Run() != FALSE)
{
Disp_modernStr("TCP_CONNECT");
if(chl_soc_Connect(p->chl, p->chlpara.ip, p->chlid)==SYS_R_OK)
{
Disp_modernStr("OK");
p->chl->ste = CHL_S_CONNECT;
p->cnt = 0;
}
else
{
//t_ip4_adr xIp; {
if(p->cnt++>3)
{
Disp_modernStr("WAIT..");
p->chl->ste = CHL_S_CONNECT;
p->cnt = 0;
}
else
{
Disp_modernStr("ERROR");
os_thd_Sleep(4000);
}
/*os_thd_Sleep(4000);
if((p->cnt%6)<3)
{
Disp_modernStr("USE MAIN IP");
reg_GetX(TERMINAL, nID_StaMIPAdr,&xIp,sizeof(t_ip4_adr));
rt_memcpy(p->chlpara.ip,&xIp,4);
p->chlid=xIp.port;
os_thd_Sleep(3000);
}
else
{
Disp_modernStr("USE SPARE IP");
reg_GetX(TERMINAL, nID_StaBIPAdr,&xIp,sizeof(t_ip4_adr));
rt_memcpy(p->chlpara.ip,&xIp,4);
p->chlid=xIp.port;
os_thd_Sleep(3000);
}
p->cnt++;
if (p->cnt > DLRCP_TCP_CONNECT_TMO)
{
rt_kprintf("TCP CONNECT ERROR!SYSTEM RST!");
//while(1);
chl_Release(p->chl);
p->chl->ste = DLRCP_S_IDLE;
} */
}
}
else
{
//这里应该判断如果MODE没连上,则DM9000的ETH线是否连好,如果是,则进行TCP连接,如何判断??
Disp_modernStr("TCP_CONNECT");
if(chl_soc_Connect(p->chl, p->chlpara.ip, p->chlid)==SYS_R_OK)
{
Disp_modernStr("OK");
p->chl->ste = CHL_S_CONNECT;
p->cnt = 0;
}
else
{
//t_ip4_adr xIp; {
if(p->cnt++>40)
{
Disp_modernStr("WAIT..");
p->chl->ste = CHL_S_CONNECT;
p->cnt = 0;
}
}
}
os_thd_Sleep(1000);
break;
case CHL_S_CONNECT://-----------------------------------------
if (p->time == rtc_GetTimet())
{
os_thd_Slp1Tick();
break;
}
p->time = rtc_GetTimet();
p->cnt += 1;
if (chl_soc_IsConnect(p->chl) == SYS_R_OK)
{
Disp_modernStr("TCP_LOGIN");
(p->linkcheck)(p, DLRCP_LINKCHECK_LOGIN);
p->cnt = 0;
p->chl->ste = CHL_S_READY;
p->ste = DLRCP_S_CHECK;
itry=0;
return TRUE;
}
else if (p->cnt > DLRCP_TCP_CONNECT_TMO)
{
Disp_modernStr("TCP_RST");
if(itry++>3)modem_Stop();
chl_Release(p->chl);
p->chl->ste = DLRCP_S_IDLE;
}
break;
case CHL_S_READY://-------------------------------------------
if(chl_soc_IsConnect(p->chl) == SYS_R_OK)
{
return TRUE;
}
else
{
chl_Release(p->chl);
p->ste = DLRCP_S_IDLE;
}
break;
}
return FALSE;
} |
|