本帖最后由 网络转接 于 2013-9-27 11:07 编辑
第一篇 TCP服务器模式简单数据收发 ----控制开发板LED灯 概要 通过TCP 服务器模式简单的建立和数据收发,我们能大概了解一下LWIP的进程流程,具体的函数说明和更详细的讲解,可以参考LWIP讲解的专业文档,这里我们主要以应用为主,不对lwip内核进行讨论,笔者也不是懂得太多,还希望大家一起讨论,指出和更正作者的错误,一起进步。使用静态设置ip的方式。 一 打开工程《科星F107开发板网络应用篇之TCP服务器》 打开MAIN.C主文件 int main(void) { System_Setup(); 底层硬件驱动初始化 时钟 IO PHY NVIC LwIP_Init(); LwIP协议栈初始化,包括IP初始化和物理地址初始化,可进入进行相应的修改 HelloWorld_init();建立一个TCP端口 while (1) { LwIP_Periodic_Handle(LocalTime); 协议任务循环调用 暂时不需要更改 这里我们不对他进行讲解 } } System_Setup(); 主要是初始化和STM32F107有关的IO和时钟 学习过我们前面的笔记 应该都比较了解了 LwIP_Init(); 初始化一个协议栈的堆栈,以便存储我们TCP建立和通信的一些参数信息或者是回调函数,同时这里设置了网络端口最主要的MAC地址和IP信息。 进入函数内部查看: void LwIP_Init(void) { struct ip_addr ipaddr; struct ip_addr netmask; struct ip_addr gw; uint8_t macaddress[6]={0,0,0,0,0,1}; mem_init();主要是告知内存堆的起止地址,以及初始化空闲表,由lwip 初始化时自己调用,该接口为内部私有接口,不对用户层开放 memp_init();将全局memp_memory按照固定块大小进行分割,并用memp_tab 进行串接 上面两个函数 完成了协议栈运行时的对栈和内存的初始化和链接,我们在这里暂且认为他处理的已经很好了 后面程序用到后 会具体理解它具体做了什么 IP4_ADDR(&ipaddr, 192, 168, 0, 8); IP4_ADDR(&netmask, 255, 255, 255, 0); IP4_ADDR(&gw, 192, 168, 0, 1); 设置ip信息 Set_MAC_Address(macaddress); 设置MAC地址 只是把mac存入全局变量 还未真正初始化到我们的网络接口 netif_add(&netif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, ðernet_input); //创建一个网络接口 netif_set_default(&netif);//初始化缺省网络接口,把前面的netif设置为缺省网络接口。 netif_set_up(&netif);//使能网络接口 建立网络接口通道 } 这里我们还有看一下一个重要的函数 netif_add(&netif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, ðernet_input); //创建一个网络接口 进入子函数 这里面有很多#if xxx #endif 没有定义的 是很多用不上的 可以删掉 这里因为全局变量已经定义 我们可以不必去掉 只看我们关心的几个赋值 下面我一一注释: struct netif * netif_add(struct netif *netif, struct ip_addr *ipaddr, struct ip_addr *netmask, struct ip_addr *gw, void *state, err_t (* init)(struct netif *netif), 我们自己写的初始化函数 err_t (* input)(struct pbuf *p, struct netif *netif))数据接收到后的递交IP层的函数 { static u8_t netifnum = 0; /* reset new interface configuration state */ netif->ip_addr.addr = 0; netif->netmask.addr = 0; netif->gw.addr = 0; netif->flags = 0; #if LWIP_DHCP /* netif not under DHCP control by default */ netif->dhcp = NULL; #endif /* LWIP_DHCP */ #if LWIP_AUTOIP /* netif not under AutoIP control by default */ netif->autoip = NULL; #endif /* LWIP_AUTOIP */ #if LWIP_NETIF_STATUS_CALLBACK netif->status_callback = NULL; #endif /* LWIP_NETIF_STATUS_CALLBACK */ #if LWIP_NETIF_LINK_CALLBACK netif->link_callback = NULL; #endif /* LWIP_NETIF_LINK_CALLBACK */ #if LWIP_IGMP netif->igmp_mac_filter = NULL; #endif /* LWIP_IGMP */ #if ENABLE_LOOPBACK netif->loop_first = NULL; netif->loop_last = NULL; #endif /* ENABLE_LOOPBACK */ /* remember netif specific state information data */ netif->state = state; netif->num = netifnum++; netif->input = input; 把最后一个参数函数给了INPUT 接收数据处理的 #if LWIP_NETIF_HWADDRHINT netif->addr_hint = NULL; #endif /* LWIP_NETIF_HWADDRHINT*/ #if ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS netif->loop_cnt_current = 0; #endif /* ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS */ netif_set_addr(netif, ipaddr, netmask, gw);设置IP等参数 /* call user specified initialization function for netif */ if (init(netif) != ERR_OK) { 执行底层初始化函数 主要是底层的数据传输函数和初始化 和硬件相关驱动 完成返回OK 说明硬件可以正常收发数据了 他调用的函数就是这个函数的参数ethernetif_init 这个函数的作用就是把底层 也就是硬件收发函数 打包成子函数传递给上层 也就是我们现在定义的网络接口 供更上层调用 主要几个函数是 进入这个函数查看 netif->output = etharp_output; IP层数据包发送函数 netif->linkoutput = low_level_output;ERP数据包发送函数 ethernetif->ethaddr = (struct eth_addr *)&(netif->hwaddr[0]); low_level_init(netif);初始化硬件 上面三个函数才是真正的和硬件相关的 到此硬件初始化 就算完成了 return NULL; } /* add this netif to the list */ netif->next = netif_list; 把我们设置的网络接口插入链路表 netif_list = netif; snmp_inc_iflist(); #if LWIP_IGMP /* start IGMP processing */ if (netif->flags & NETIF_FLAG_IGMP) { igmp_start( netif); } #endif /* LWIP_IGMP */ LWIP_DEBUGF(NETIF_DEBUG, ("netif: added interface %c%c IP addr ", netif->name[0], netif->name[1])); ip_addr_debug_print(NETIF_DEBUG, ipaddr); LWIP_DEBUGF(NETIF_DEBUG, (" netmask ")); ip_addr_debug_print(NETIF_DEBUG, netmask); LWIP_DEBUGF(NETIF_DEBUG, (" gw ")); ip_addr_debug_print(NETIF_DEBUG, gw); LWIP_DEBUGF(NETIF_DEBUG, ("\n")); return netif; } 这里或许应该还有很多疑问和不解 先不纠缠 我们就认为网卡初始化就结束了,能正常收发数据了。也就是说LwIP_Init 完成了网卡初始化 可以正常接收数据了 这里如果我们下载进去程序到开发板 给他ip发数据就能接收到底层arp数据了 这里我们就可以ping通我们的开发板了。
|