int main(void)
{
system_clock.initialize(); //系统时钟初始化
led.initialize(); //LED初始化
adc.initialize(); //ADC初始化
delay.initialize(216); //延时初始化
my_malloc.initialize(SRAMIN); //动态内存初始化
usart6.initialize(115200); //串口波特设置
usart6.printf("\033[1;32;40m"); //设置字体终端为绿色
usart6.printf("\r\nHello, I am iCore4!\r\n\r\n"); //串口信息输出
OSInit(); //UCOS初始化
while(lwip.initialize()) //lwip初始化
{
LED_RED_ON;
usart6.printf("\r\nETH initialize error!\r\n\r\n");//ETH初始化失败
}
udp.initialize(); //modbus_tcp初始化
OSTaskCreate(start_task,(void*)0,(OS_STK*)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO);
OSStart(); //开启UCOS
}
//LWIP初始化(LWIP启动的时候使用)
//返回值:0,成功
// 1,内存错误
// 2,LAN8720初始化失败
// 3,网卡添加失败.
u8 lwip_comm_init(void)
{
OS_CPU_SR cpu_sr;
struct netif *Netif_Init_Flag; //调用netif_add()函数时的返回值,用于判断网络初始化是否成功
struct ip_addr ipaddr; //ip地址
struct ip_addr netmask; //子网掩码
struct ip_addr gw; //默认网关
if(lan8720.memory_malloc())return 1; //内存申请失败
if(lwip_comm_mem_malloc())return 1; //内存申请失败
if(lan8720.initialize())return 2; //初始化LAN8720失败
tcpip_init(NULL,NULL); //初始化tcp ip内核,该函数里面会创建tcpip_thread内核任务
lwip_comm_default_ip_set(&lwipdev); //设置默认IP等信息
#if LWIP_DHCP //使用动态IP
ipaddr.addr = 0;
netmask.addr = 0;
gw.addr = 0;
#else //使用静态IP
IP4_ADDR(&ipaddr,lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]);
IP4_ADDR(&netmask,lwipdev.netmask[0],lwipdev.netmask[1] ,lwipdev.netmask[2],lwipdev.netmask[3]);
IP4_ADDR(&gw,lwipdev.gateway[0],lwipdev.gateway[1],lwipdev.gateway[2],lwipdev.gateway[3]);
usart6.printf("网卡en的MAC地址为:.........%d.%d.%d.%d.%d.%d\r\n",lwipdev.mac[0],lwipdev.mac[1],lwipdev.mac[2],lwipdev.mac[3],lwipdev.mac[4],lwipdev.mac[5]);
usart6.printf("静态IP地址.........%d.%d.%d.%d\r\n",lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]);
usart6.printf("子网掩码..........%d.%d.%d.%d\r\n",lwipdev.netmask[0],lwipdev.netmask[1],lwipdev.netmask[2],lwipdev.netmask[3]);
usart6.printf("默认网关.........%d.%d.%d.%d\r\n",lwipdev.gateway[0],lwipdev.gateway[1],lwipdev.gateway[2],lwipdev.gateway[3]);
#endif
Netif_Init_Flag=netif_add(&lwip_netif,&ipaddr,&netmask,&gw,NULL,ðernetif_init,&tcpip_input);//向网卡列表中添加一个网口
#if LWIP_DNS
dns_init();
#endif
if(Netif_Init_Flag==NULL)return 3; //网卡添加失败
else//网口添加成功后,设置netif为默认值,并且打开netif网口
{
netif_set_default(&lwip_netif); //设置netif为默认网口
netif_set_up(&lwip_netif); //打开netif网口
}
return 0;//操作OK.
}
static INT8U udp_demo_init(void)//创建UDP线程
{
INT8U res;
OS_CPU_SR cpu_sr;
OS_ENTER_CRITICAL(); //关中断
//创建UDP线程
res = OSTaskCreate(udp_thread,(void*)0,(OS_STK*)&UDP_TASK_STK[UDP_STK_SIZE-1],UDP_PRIO);
OS_EXIT_CRITICAL(); //开中断
return res; //返回值:0 UDP创建成功
}
static void udp_thread(void *arg)//udp任务函数
{
err_t err,recv_err;
struct netconn *udpconn;
struct netbuf *udprecvbuf;
struct ip_addr udp_destipaddr;
LWIP_UNUSED_ARG(arg);
udpconn = netconn_new(NETCONN_UDP); //创建一个UDP链接
if(udpconn != NULL) //创建UDP连接成功
{
err = netconn_bind(udpconn,IP_ADDR_ANY,UDP_REMOTE_PORT);
//构造目的IP地址
IP4_ADDR(&udp_destipaddr,lwipdev.remoteip[0],lwipdev.remoteip[1], lwipdev.remoteip[2],lwipdev.remoteip[3]);
netconn_connect(udpconn,&udp_destipaddr,UDP_LOUCAL_PORT); //连接到远端电脑主机端口 :60002
if(err == ERR_OK)//绑定完成
{
udpconn->recv_timeout = 10;
while(1)
{
recv_err = netconn_recv(udpconn,&udprecvbuf);
if((recv_err == ERR_OK)||(udprecvbuf != NULL)) //接收到数据
{
recv_err = netconn_send(udpconn,udprecvbuf);
OSTimeDlyHMSM(0,0,0,5);
netbuf_delete(udprecvbuf);
}
OSTimeDlyHMSM(0,0,0,5);
}
}else usart6.printf("UDP绑定失败\r\n");
}else usart6.printf("UDP连接创建失败\r\n");
}