您当前的位置:五五电子网电子知识单片机-工控设备51单片机一种uIP TCP/IP协议栈在51系列单片机上的实现 正文
一种uIP TCP/IP协议栈在51系列单片机上的实现

一种uIP TCP/IP协议栈在51系列单片机上的实现

点击数:7170 次   录入时间:03-04 11:38:04   整理:http://www.55dianzi.com   51单片机

  uIP提供的源代码中包括一个基于HTTP协议的WEB SERVER示例,该WEB SERVER通过简单的文件系统在数据存储器中存储静态页面,同时具有CGI功能。用户可以参照该示例以及uIP提供给应用程序的接口函数说明实现自己的应用层功能。用户的应用程序中必须将 UIP_APPCALL宏定义为该层的服务程序。例如:在示例程序中WEB SERVER的处理程序为httpd()函数,则要进行如下的宏定义#define UIP_APPCALL httpd.

  51系列单片机上都有2到3个定时计数器,可以选择其中的一个来为TCP/IP协议中与时间有关的事件定时。需要由用户处理的定时事件包括:为uip_periodic()函数的执行提供基准,还要为ARP表项的更新定时。uip_periodic()函数每0.5秒执行一次,ARP表项每10秒更新一次。

  uIP的设置单独包含在一个叫uipopt.h的头文件里,都是以宏的形式定义方便于修改。用户应根据自己的应用在uipopt.h文件里设置本地的物理地址、IP地址、网关地址、收发缓冲区的大小、支持的最大连接数、ARP表大小等等选项。

www.55dianzi.com

  添加了必须的模块,对uIP进行了正确地配置后,需要编写主程序函数。针对基于以太网的WEB SERVER应用,主程序在完成初始化后将不停的进行查询,如果有新数据包到达则送uip_input()函数处理;如果没有新数据包到达则处理定时事件。框架代码如下所示:

通过实际的代码说明uIP协议栈的主控制循环。

  void main(void)

  {

  /*省略部分代码*/

  /*设置TCP超时处理时间和ARP老化时间*/

  timer_set(&perioDIC_timer, CLOCK_CONF_SECOND / 2);

  timer_set(&arp_timer, CLOCK_CONF_SECOND * 10);

  /*定时器初始化*/

  init_Timer();

  /*协议栈初始化*/

  uip_init();

  uip_arp_init();

  /*应用层初始化*/

  example1_init();

  /*驱动层初始化*/

  etherdev_init();

  /*IP地址、网关、掩码设置*/

  uip_ipaddr(ipaddr, 192,168,1,9);

  uip_sethostaddr(ipaddr);

  uip_ipaddr(ipaddr, 192,168,1,16);

  uip_setdraddr(ipaddr);

  uip_ipaddr(ipaddr, 255,255,255,0);

  uip_setnetmask(ipaddr);

  /*主循环*/

  while(1)

  {

  /*从网卡读数据*/

  uip_len = etherdev_read();

  /*假如存在数据则按协议处理*/

  if(uip_len > 0)

  {

  /*收到的是IP数据,调用uip_input()处理*/

  if(BUF->type == htons(UIP_ETHTYPE_IP))

  {

  uip_arp_iPIN();

  uip_input();

  /*处理完成后,假如uip_buf中有数据,则调用etherdev_send 发送出往*/

  if(uip_len > 0)

  {

  uip_arp_out();

  etherdev_send();

  }

  }

www.55dianzi.com

  /*收到的是ARP数据,调用uip_arp_arPIN()处理*/

  else if(BUF->type == htons(UIP_ETHTYPE_ARP)) {

  uip_arp_arpin();

  if(uip_len > 0)

  {

  etherdev_send();

  }

  }

  }

  /*查看0.5S是否到了,到了则调用uip_perioDIC处理TCP超时程序*/

  else if(timer_expired(&periodIC_timer))

  {

  timer_reset(&periodic_timer);

  for(i = 0; i < UIP_CONNS; i++)

  {

  uip_periodic(i);

  if(uip_len > 0)

  {

  uip_arp_out();

  etherdev_send();

  }

  }

  /*查看10S是否到了,到了则调用ARP处理程序*/

  if(timer_expired(&arp_timer))

  {

  timer_reset(&arp_timer);

  uip_arp_timer();

  }

  }

  }

  return;

  }

  以上实例在keil C51编译器下设置大模式,优化等级6(速度优先)进行编译,对uIP代码部分可以不做任何修改,对HTTP示例代码仅需针对类型表达进行极少量的修改即可编译通过。在硬件平台上运行良好。

  五 总结

  uIP协议栈采用有效的方法和结构化的代码,使其存储器占用量很小并且可以很方便的应用到不同的工程项目中。同时它又是免费的可以自由使用于商业和非商业目的。uIP为低端嵌入式设备的网络接入提供了很好的解决方案,具有很高的应用价值。


 



上一页  [1] [2] 


本文关键字:单片机  IP协议  51单片机单片机-工控设备 - 51单片机

《一种uIP TCP/IP协议栈在51系列单片机上的实现》相关文章>>>