高级会员
- 积分
- 539
- 金钱
- 539
- 注册时间
- 2017-7-28
- 在线时间
- 109 小时
|
楼主 |
发表于 2018-5-9 10:12:37
|
显示全部楼层
[mw_shl_code=c,true]#include "sys.h"
#include "string.h"
#include "delay.h"
#include "usart.h"
#include "dma.h"
#include "led.h"
#include "key.h"
#include "lwip_comm.h"
#include "LAN8720.h"
#include "timer.h"
#include "sram.h"
#include "malloc.h"
#include "lwip/netif.h"
#include "lwip_comm.h"
#include "lwipopts.h"
#include "tcp_server_demo.h"
#include "tcp_client_demo.h"
#include "udp_demo.h"
int main(void)
{
u8 speed;
delay_init(168); //延时初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断分组配置
MYDMA_Config(DMA2_Stream5,DMA_Channel_4,(u32)&USART1->DR,(u32)uart_recbuf,uart_recbufsize);
uart_init(115200); //串口波特率设置
LED_Init(); //LED初始化
mymem_init(SRAMIN); //初始化内部内存池
mymem_init(SRAMCCM); //初始化CCM内存池
TIM3_Int_Init(999,839); //100khz的频率,计数1000为10ms
while(lwip_comm_init()) //lwip初始化
{
printf("LWIP Init Falied!\r\n");
delay_ms(1200);
printf("Retrying...\r\n");
}
printf("LWIP Init Success!\r\n");
#if LWIP_DHCP
while((lwipdev.dhcpstatus!=2)&&(lwipdev.dhcpstatus!=0XFF))//等待DHCP获取成功/超时溢出
{
lwip_periodic_handle();
}
#endif
speed=LAN8720_Get_Speed();//得到网速
if(speed&1<<1)printf("Ethernet Speed:100M\r\n");
else printf("Ethernet Speed:10M\r\n");
printf("PORT: 8089\r\n");
delay_ms(500); //延时1s
delay_ms(500);
while(1)
{
u8 i;
u8 res=0;
u8 t=0;
err_t err;
struct ip_addr locipaddr;
struct ip_addr rmtipaddr; //远端ip地址
IP4_ADDR(&locipaddr,lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]);
IP4_ADDR(&rmtipaddr,lwipdev.remoteip[0],lwipdev.remoteip[1],lwipdev.remoteip[2],lwipdev.remoteip[3]);
struct udp_pcb *udppcb; //
struct tcp_pcb *tcppcbclient; //定义一个TCP服务器控制块
struct tcp_pcb *tcppcbserver; //定义一个TCP服务器控制块
struct tcp_pcb *tcppcbconn; //定义一个TCP服务器控制块
udppcb=udp_new();
tcppcbclient=tcp_new(); //创建一个新的pcb
tcppcbserver=tcp_new(); //创建一个新的pcb
#if 1
if(udppcb)//创建成功
{
err=udp_connect(udppcb,&rmtipaddr,UDP_DEMO_PORT);//UDP客户端连接到指定IP地址和端口号的服务器
if(err==ERR_OK)
{
err=udp_bind(udppcb,&locipaddr,UDP_DEMO_PORT);//绑定本地IP地址与端口号
if(err==ERR_OK) //绑定完成
{
udp_recv(udppcb,udp_demo_recv,NULL);//注册接收回调函数
udp_demo_flag |= 1<<5; //标记已经连接上
}else res=1;
}else res=1;
}else res=1;
#endif
#if 0
if(tcppcbclient) //创建成功
{ tcp_connect(tcppcbclient,&rmtipaddr,REMOTE_PORT,tcp_client_connected);//连接到目的地址的指定端口上,当连接成功后回调tcp_client_connected()函数
}else res=1;
#endif
#if 1
if(tcppcbserver) //创建成功
{
err=tcp_bind(tcppcbserver,&locipaddr,TCP_SERVER_PORT); //将本地IP与指定的端口号绑定在一起,IP_ADDR_ANY为绑定本地所有的IP地址
if(err==ERR_OK) //绑定完成
{
tcppcbconn=tcp_listen(tcppcbserver); //设置tcppcb进入监听状态
tcp_accept(tcppcbconn,tcp_server_accept); //初始化LWIP的tcp_accept的回调函数
}else res=1;
}else res=1;
#endif
while(res==0)
{
if(udp_demo_flag&1<<6)
{
for(i=0;i<=udptotal_len;i++)
{
USART_SendData(USART1, udp_demo_recvbuf); //向串口2发送数据
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
}
udptotal_len=0;
udp_demo_flag&=~(1<<6);//标记数据已经被处理了.
}
if(tcp_client_flag&1<<6)//是否收到数据
{
for(i=0;i<=tcpclienttotal_len;i++)
{
USART_SendData(USART1,tcp_client_recvbuf); //向串口2发送数据
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
}
tcpclienttotal_len=0;
tcp_client_flag&=~(1<<6);//标记数据已经被处理了.
}
if(tcp_server_flag&1<<6)
{
for(i=0;i<=tcpservertotal_len;i++)
{
USART_SendData(USART1, tcp_server_recvbuf); //向串口2发送数据
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
}
tcpservertotal_len=0;//
tcp_server_flag&=~(1<<6);//标记数据已经被处理了.
}
if(udp_demo_flag&1<<7)
{
udp_demo_senddata(udppcb);
udp_demo_flag&=~(1<<7); //清除数据发送标志位
}
lwip_periodic_handle();
delay_ms(2);
t++;
if(t==200)
{
t=0;
LED0=!LED0;
}
}
udp_demo_connection_close(udppcb); //断开udp连接
tcp_client_connection_close(tcppcbclient,0);//关闭TCP Client连接
tcp_server_connection_close(tcppcbserver,0);//关闭TCP Server连接
tcp_server_connection_close(tcppcbconn,0);//关闭TCP Server连接
tcp_server_remove_timewait();
memset(tcppcbserver,0,sizeof(struct tcp_pcb));
memset(tcppcbconn,0,sizeof(struct tcp_pcb));
delay_ms(100);
}
}
[/mw_shl_code] |
|