TCPnet+ucos程序拔网线后死机
大佬们,我这程序开机连上发送数据都是好的能正常收发,但是拔了网线之后程序就跳到OS_TickListInsert里面跑死循环了。这是为什么啊:dizzy:用的是TCP客户端的例程移植到项目里的 void TCPnetTest(void)
{
int32_t iCount;
uint8_t *sendbuf;
static uint8_t tcp_status;
uint16_t maxlen;
int i,index;
uint8_t j;
OS_ERR err;
CPU_TS ts;
OS_FLAGS xResult;
const uint16_t usMaxBlockTime = 10; /* 延迟周期 */
static u8 res;
init_ethernet();
init_TcpNet();
dhcp_disable ();
ip_config.IpAdr=net_var.local_ip_addr;
ip_config.IpAdr=net_var.local_ip_addr;
ip_config.IpAdr=net_var.local_ip_addr;
ip_config.IpAdr=net_var.local_ip_addr;
ip_config.NetMask=255;
ip_config.NetMask=255;
ip_config.NetMask=255;
ip_config.NetMask=0;
ip_config.DefGW=192;
ip_config.DefGW=168;
ip_config.DefGW=1;
ip_config.DefGW=1;
ip_config.PriDNS=194;
ip_config.PriDNS=25;
ip_config.PriDNS=2;
ip_config.PriDNS=129;
ip_config.SecDNS=194;
ip_config.SecDNS=25;
ip_config.SecDNS=2;
ip_config.SecDNS=130;
mem_copy ((U8 *)&localm, (U8 *)&ip_config, sizeof(ip_config));
/*
创建TCP Socket并连接,客户端连接服务器后,10秒内无数据通信将断开连接。
但是由于这里使能了TCP_TYPE_KEEP_ALIVE,会一直保持连接,不受10秒的时间限制。
*/
socket_tcp = tcp_get_socket (TCP_TYPE_CLIENT | TCP_TYPE_KEEP_ALIVE, 0, 10, tcp_callback);
if(socket_tcp != 0)
{
res=tcp_connect(socket_tcp, net_var.aim_ip_addr, net_var.port_num, net_var.port_num);
}
OSFlagCreate ((OS_FLAG_GRP*)&FLAG_TCPnet,
(CPU_CHAR *)"FLAG TCPnet",
(OS_FLAGS )0,
(OS_ERR *)&err);
while (1)
{
main_TcpNet();
tcp_status = TCP_StatusCheck(); //用于网线插拔的处理
xResult = OSFlagPend ((OS_FLAG_GRP*)&FLAG_TCPnet,
(OS_FLAGS )0x01,
(OS_TICK )usMaxBlockTime,
(OS_OPT )OS_OPT_PEND_FLAG_SET_ANY +OS_OPT_PEND_BLOCKING,
(CPU_TS *)&ts,
(OS_ERR *)&err);
if((err == OS_ERR_NONE)&&(tcp_status == __TRUE))
{
iCount = tcp_SendLen;
do
{
main_TcpNet();
if (tcp_check_send (socket_tcp) == __TRUE)
{
maxlen = tcp_max_dsize (socket_tcp);
iCount -= maxlen;
if(iCount < 0)
{
maxlen = iCount + maxlen;
}
sendbuf = tcp_get_buf(maxlen);
memcpy(sendbuf,tcp_Sendbuf,tcp_SendLen);
tcp_send (socket_tcp, sendbuf, tcp_SendLen);
OSFlagPost ((OS_FLAG_GRP*)&FLAG_TCPnet,
(OS_FLAGS )0x01,
(OS_OPT )OS_OPT_POST_FLAG_CLR,
(OS_ERR *)&err);
}
}while(iCount > 0);
}
OSTimeDly(1, OS_OPT_TIME_DLY, &err);
}
}
/*
*********************************************************************************************************
* 函 数 名: NetSendData
* 功能说明: TCP发送数据并等待发送完毕
* 形 参: cod 数据指针,len 数据长度
* 返 回 值: 无
*********************************************************************************************************
*/
void NetSendData(char *cod,u16 len)
{
OS_ERR err;
CPU_TS ts;
const uint16_t usMaxBlockTime = 5000; /* 延迟周期 */
tcp_Sendbuf = cod;
tcp_SendLen = len;
OSFlagPost ((OS_FLAG_GRP*)&FLAG_TCPnet,
(OS_FLAGS )0x01,
(OS_OPT )OS_OPT_POST_FLAG_SET,
(OS_ERR *)&err);
OSFlagPend ((OS_FLAG_GRP*)&FLAG_TCPnet,
(OS_FLAGS )0x01,
(OS_TICK )usMaxBlockTime,
(OS_OPT )OS_OPT_PEND_FLAG_CLR_ANY + OS_OPT_PEND_BLOCKING,
(CPU_TS *)&ts,
(OS_ERR *)&err);
}
uCOS配TCPnet由于不是原装的,接口函数的地方处理的不太好,你方便的话,使用RTX测试。
页:
[1]