|
一、硬件平台及配置情况
CPU:STM32F103ZET
ETH:DM9000A
LWIP版本:1.3.2
开发板运行TCP服务端,IP为192.168.1.10端口为1026,PC运行TCP客户端,IP为192.168.1.2。
PC端测试软件为:网络调试助手 V3.7
软件运行时选择tcpclient模式,连接到服务器的IP为192.168.1.10端口为1026,能够连接成功。
然后以十六进制数据流(发送间隔500ms)发送0xaa 0x01 0x02 0x03,没法送一次以上数据,接收端就会收到4096字节数据。
二、问题描述
问题是运行几分钟后就只有发送没有接收了,也ping不通了。
三、上代码
//-----------------------------------------------------------------------------
// 入口
//-----------------------------------------------------------------------------
int main(void)
{
SystemInit();
LED_Config();
InitUsart(115200);
LwIpInit();
LED_Loop();
Tcp_Server_Init();
SysTick_Config(72000000/1000);
printf( "Lwip TcpServer Started
"\n "Server IP:192.168.1.10
"\n "Server Port:1026
"
);
while (1)
{
ethernetif_input(&netif);// 读取eth的数据包
LwIP_Periodic_Handle(SystermTime);// tcp老化处理(250ms跟5000ms的tcp老化程序)
if(1 == ETH_RX_CMP)
{
ETH_RX_CMP = 0;
Eth_Data_Handle();
}
}
}
//-----------------------------------------------------------------------------
// 接收到数据解析
//-----------------------------------------------------------------------------
static void Eth_Data_Handle(void)
{
if(eth_rev_buff[1] == 0x01)
{
if(eth_send_ok == 1)
{
Eth_Send(eth_send_buff,4096);
eth_send_ok = 0;
}
}
th_rev_buff[1] = 0;
}
//-----------------------------------------------------------------------------
// 初始化
//-----------------------------------------------------------------------------
void Tcp_Server_Init(void)
{
struct tcp_pcb *pcb;
/* Create a new TCP control block */
pcb = tcp_new();
/* Bind the pcb to the port */
/* Using IP_ADDR_ANY allow the pcb to be used by any local interface */
tcp_bind(pcb, IP_ADDR_ANY, 1026);
pcb = tcp_listen(pcb); // 将此tcp连接移至侦听tcp队列中去
tcp_accept(pcb, tcp_server_accept); // 初始化pcb->accept
}
//-----------------------------------------------------------------------------
// 回调函数 连接响应
//-----------------------------------------------------------------------------
err_t tcp_server_accept(void *arg, struct tcp_pcb *pcb,err_t err)
{
tcp_server_pcb = pcb; // 将此PCB保存
tcp_setprio(pcb,TCP_PRIO_MIN);
tcp_recv(pcb,tcp_server_recv);
tcp_write(pcb,Connect_data,sizeof(Connect_data),0);
tcp_output(pcb); // 立即发送数据
tcp_sent(tcp_server_pcb,tcp_sended);// 发送成功后本函数的回调函数会被调用
err = ERR_OK;
return err;
}
//-----------------------------------------------------------------------------
// 回调函数 接收数据
//-----------------------------------------------------------------------------
err_t tcp_server_recv(void *arg, struct tcp_pcb *pcb,struct pbuf *p,err_t err)
{
unsigned int i;
tcp_server_pcb = pcb; // 将此PCB保存
if(p != NULL)
{
eth_rev_len = p->len;
if(eth_rev_len <= 1024)
{
for(i=0;i<eth_rev_len;i++)
{
eth_rev_buff=*((char *)p->payload+i);
}
tcp_recved(pcb,eth_rev_len);
ETH_RX_CMP = 1; // 收到数据了
}
}
pbuf_free(p); // 释放PBUF
err = ERR_OK;
return err;
}
//-----------------------------------------------------------------------------
// 回调函数 数据发送成功
//-----------------------------------------------------------------------------
err_t tcp_sended(void *arg, struct tcp_pcb *pcb,u16_t len)
{
// printf("Data Sended Len = %d
",len);
Init_Data();
eth_send_ok = 1;
return ERR_OK;
}
//-----------------------------------------------------------------------------
// ETH发送
//-----------------------------------------------------------------------------
void Eth_Send(unsigned char *p,unsigned int len)
{
tcp_write(tcp_server_pcb,p,len,0); // 放入队列 最大字节在“lwipopt.h”中设置
tcp_output(tcp_server_pcb); // 立即发送
tcp_sent(tcp_server_pcb,tcp_sended); // 发送成功后本函数的回调函数会被调用
}
//-----------------------------------------------------------------------------
// 生成数据
//-----------------------------------------------------------------------------
void Init_Data(void)
{
unsigned int i;
for(i=0;i<4096;i++)
{
eth_send_buff = i;
}
eth_send_buff[0] = 0xAA;
eth_send_buff[1] = 0xAA;
eth_send_buff[2] = 0x10;
eth_send_buff[3] = 0x00;
}
//-----------------------------------------------------------------------------
// 系统滴答
//-----------------------------------------------------------------------------
void SysTick_Handler(void)
{
SystermTime++;
}
//-----------------------------------------------------------------------------
// TCP老化
//-----------------------------------------------------------------------------
void LwIP_Periodic_Handle(__IO uint32_t localtime)
{
/* TCP periodic process every 250 ms */
if ((localtime - TCPTimer) >= 250)//TCP_TMR_INTERVAL)
{
TCPTimer = localtime;
// printf("TCPTimer = %d\n",TCPTimer);
tcp_tmr();
/* ARP periodic process every 5s */
if ((localtime - ARPTimer) >= 5000)//ARP_TMR_INTERVAL)
{
ARPTimer = localtime;
// printf("ARPTimer = %d\n",ARPTimer);
etharp_tmr();
}
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|