[原创] 以太网学习的一点心得

academic   2010-11-30 18:15 楼主

前一段时间是针对专门的问题,发了一些帖子,这次在从最基本简单的入手,让我们一起逐步地深入吧。

1.首先我们可以在桌面上创建一个文件夹,my_proj。

2.把StellarisWare下的一些文件夹复制到my_proj下,其中progjects文件夹用来保存我们要创建的工程,这样我们以后要用到的文件都包含在下图中的文件夹中了,不至于太多无关的文件浪费时间。

1.jpg

3.在projects文件夹下创建enet_udp文件夹,我们将一步步地完成一个简单的基于的UDP客户端地例子。

4.在enet_udp文件夹中创建工程enet_udp.uvproj。并配置工程,具体的配置,可以参考StellarisWare的例程。

5.创建enet_udp.c文件,并添加到工程中。然后添加最重要的两个文件到工程中,driverlib和lwiplib.c

6.此时编译一下,会发现有很多头文件找不到。不用急,我们可以根据提示的错误添加相应的头文件路径。我比较喜欢使用下面的方法,简单。编译,出错,添加路径,再编译,再出错,再添加。当然多手动添加几次,就会对lwip文件结构有一个整体的认识,以后就会很快了。最后别忘了添加当前目录。

2.jpg

7.最后别忘了复制一个lwipopts.h到工程当前文件夹下,它是配置lwip协议栈最重要的文件。然后配置启动文件。

8.开始编写主程序enet_udp.c中的内容。这里对网上的进行了某些地方的修改,但这只是最基本的发送,以后在这个基础上逐步地去深入。

9.添加常见的头文件

#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_nvic.h"
#include "inc/hw_types.h"
#include "inc/hw_sysctl.h"

#include "driverlib/ethernet.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/sysctl.h"
#include "driverlib/systick.h"
#include "utils/lwiplib.h"

 

#define My_Mac_ID  {0X00,0x14,0x97,0x0F,0x1D,0xE3}  //存储以太网控制器的物理地址,即MAC地址

#define MY_IP_ID        {192,168,0,100}                   //以太网通信的IP地址
#define IP_MARK_ID    {255,255,255,0}             //255.255.255.0,子网掩码
#define MY_GATEWAY_ID   {192,168,0,1}                     //以太网通信的网关地址
static const unsigned char pucMACAddress[]=My_Mac_ID;
static const unsigned char IPAddress[] = MY_IP_ID;
static const unsigned char NetMaskAddr[] = IP_MARK_ID;
static const unsigned char GwWayAddr[] = MY_GATEWAY_ID;

const static unsigned char UDPData[]="LwIP UDP客户端在Luminary微控制器上的测试\r\n";

#define SYSTICKHZ                100
#define SYSTICKMS               (1000 / SYSTICKHZ)
#define SYSTICKUS               (1000000 / SYSTICKHZ)
#define SYSTICKNS               (1000000000 / SYSTICKHZ)


void
SysTickIntHandler(void)
{
   
  lwIPTimer(SYSTICKMS);

}


int
main(void)
{
 
    struct ip_addr ulIPAddr,ulNetMask,ulGWAddr;
   struct udp_pcb *Pcb1;
   struct ip_addr ipaddr1;
   struct pbuf *p;

      if(REVISION_IS_A2)
    {
        SysCtlLDOSet(SYSCTL_LDO_2_75V);
    }

    SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
                   SYSCTL_XTAL_8MHZ);
  
    SysCtlPeripheralEnable(SYSCTL_PERIPH_ETH);
    SysCtlPeripheralReset(SYSCTL_PERIPH_ETH);

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    GPIOPinTypeEthernetLED(GPIO_PORTF_BASE, GPIO_PIN_2 | GPIO_PIN_3);

 

    SysTickPeriodSet(SysCtlClockGet() / SYSTICKHZ);
    SysTickEnable();
    SysTickIntEnable();

    IntMasterEnable();
 
        IP4_ADDR(&ulIPAddr,IPAddress[3],IPAddress[2],IPAddress[1],IPAddress[0]);
        IP4_ADDR(&ulNetMask,NetMaskAddr[3],NetMaskAddr[2],NetMaskAddr[1],NetMaskAddr[0]);
        IP4_ADDR(&ulGWAddr,GwWayAddr[3],GwWayAddr[2],GwWayAddr[1],GwWayAddr[0]);
        lwIPInit(pucMACAddress,ulIPAddr.addr, ulNetMask.addr, ulGWAddr.addr, IPADDR_USE_STATIC);
  
   p = pbuf_alloc(PBUF_RAW,sizeof(UDPData),PBUF_RAM);
   p->payload=(void *)UDPData;
  
  IP4_ADDR(&ipaddr1,192,168,0,127); //这里是PC机的IP地址。
  Pcb1 = udp_new();
 
  udp_bind(Pcb1,IP_ADDR_ANY,1025);   /* 绑定到本地IP地址,设端口为1025,客户端一般为偶数。*/

  udp_connect(Pcb1,&ipaddr1,1025);    /* 连接PC机上的1025号端口,其实服务器的端口一般为奇数。*/


    while(1)
  {
    udp_send(Pcb1,p);
    SysCtlDelay(SysCtlClockGet()/3);
  }


}

 

3.jpg

 

[ 本帖最后由 academic 于 2011-4-10 12:29 编辑 ]

回复评论 (134)

支持

学习...................
http://www.tdhj.cn
点赞  2010-11-30 20:09

写得不错,顶下

http://shop34182318.taobao.com/ https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
点赞  2010-12-1 16:11

上面的程序是最简单的使用lwIP来循环发送UDP数据报,下面对它进行完善后,使它具有接收UDP数据报的功能,并在需要的时候来发送UDP数据包的一个简单例子,并顺便学习几个重要的字符串处理函数的使用。

#include <string.h>
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_nvic.h"
#include "inc/hw_types.h"
#include "inc/hw_sysctl.h"

#include "driverlib/ethernet.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/sysctl.h"
#include "driverlib/systick.h"
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h"

#include "utils/lwiplib.h"
#include "utils/ustdlib.h"


#define My_Mac_ID  {0X00,0x14,0x97,0x0F,0x1D,0xE3}  //存储以太网控制器的物理地址,即MAC地址

#define MY_IP_ID        {192,168,0,100}                   //以太网通信的IP地址
#define IP_MARK_ID    {255,255,255,0}             //255.255.255.0,子网掩码
#define MY_GATEWAY_ID   {192,168,0,1}                     //以太网通信的网关地址
static const unsigned char pucMACAddress[]=My_Mac_ID;
static const unsigned char IPAddress[] = MY_IP_ID;
static const unsigned char NetMaskAddr[] = IP_MARK_ID;
static const unsigned char GwWayAddr[] = MY_GATEWAY_ID;

 

//const static unsigned char UDPData[]="LwIP UDP客户端在Luminary微控制器上的测试\r\n";

#define SYSTICKHZ                100
#define SYSTICKMS               (1000 / SYSTICKHZ)
#define SYSTICKUS               (1000000 / SYSTICKHZ)
#define SYSTICKNS               (1000000000 / SYSTICKHZ)

static struct udp_pcb *g_psPCB = NULL;
void
SysTickIntHandler(void)
{
   
  lwIPTimer(SYSTICKMS);

}
static void
APP_recv_udp(void *arg, struct udp_pcb *pcb, struct pbuf *p,
              struct ip_addr *addr, u16_t port)
{
  char *pcData = p->payload;
  struct pbuf *p_out;
  static char pcBuf[100];
  unsigned long ulIPAddr;
  unsigned char pucMACAddr[6];
  ulIPAddr = lwIPLocalIPAddrGet();
    if(ulIPAddr == 0)
    {
        return;
    }
    lwIPLocalMACGet(pucMACAddr);
   usprintf(pcBuf,"\r\nTHE TARGET IP IS:%d.%d.%d.%d AND THE MAC IS:%02X%02X%02X%02X%02X%02X", ((ulIPAddr >>  0) & 0xFF),
                     ((ulIPAddr >>  8) & 0xFF), ((ulIPAddr >> 16) & 0xFF),
                     ((ulIPAddr >> 24) & 0xFF),
                     pucMACAddr[0],
                     pucMACAddr[1], pucMACAddr[2], pucMACAddr[3],
                     pucMACAddr[4], pucMACAddr[5]);
 //说明是外设控制
 p_out = pbuf_alloc(PBUF_TRANSPORT, strlen(pcBuf), PBUF_RAM);
  if(p_out != NULL)
            {
               
                memcpy(p_out->payload,pcBuf, strlen(pcBuf));
                udp_send(g_psPCB, p_out);
                pbuf_free(p_out);
           
            }
  if(strncmp(pcData, "CONTROL LED ON", 14) == 0)
    {
     GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_PIN_0);
        pbuf_free(p);
        return;
    }

    
   if(ustrstr(pcData, "OFF") != NULL)
    {
        GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_0, 0);
  pbuf_free(p);
        return;
    }
   
 pbuf_free(p);
    return;
}
void
io_init(void)
{
 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
 GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,GPIO_PIN_0);
 GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_0, 0);
}

int
main(void)
{
 
   struct ip_addr ulIPAddr,ulNetMask,ulGWAddr;
   struct udp_pcb *Pcb1;
   struct ip_addr ipaddr1;
//   struct pbuf *p;

      if(REVISION_IS_A2)
    {
        SysCtlLDOSet(SYSCTL_LDO_2_75V);
    }

    SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
                   SYSCTL_XTAL_8MHZ);
  
    SysCtlPeripheralEnable(SYSCTL_PERIPH_ETH);
    SysCtlPeripheralReset(SYSCTL_PERIPH_ETH);

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    GPIOPinTypeEthernetLED(GPIO_PORTF_BASE, GPIO_PIN_2 | GPIO_PIN_3);

 io_init(); 

    SysTickPeriodSet(SysCtlClockGet() / SYSTICKHZ);
    SysTickEnable();
    SysTickIntEnable();

    IntMasterEnable();
 
  IP4_ADDR(&ulIPAddr,IPAddress[3],IPAddress[2],IPAddress[1],IPAddress[0]);
        IP4_ADDR(&ulNetMask,NetMaskAddr[3],NetMaskAddr[2],NetMaskAddr[1],NetMaskAddr[0]);
        IP4_ADDR(&ulGWAddr,GwWayAddr[3],GwWayAddr[2],GwWayAddr[1],GwWayAddr[0]);
        lwIPInit(pucMACAddress,ulIPAddr.addr, ulNetMask.addr, ulGWAddr.addr, IPADDR_USE_STATIC);
  
//   p = pbuf_alloc(PBUF_RAW,sizeof(UDPData),PBUF_RAM);
//   p->payload=(void *)UDPData;
  
  IP4_ADDR(&ipaddr1,192,168,0,127);
  g_psPCB=Pcb1 = udp_new();
  udp_recv(Pcb1, APP_recv_udp, NULL);
  udp_bind(Pcb1,IP_ADDR_ANY,1025);   /* 绑定本地IP地址 */
  udp_connect(Pcb1,&ipaddr1,1025);    /* 连接远程主机 */


    while(1)
  {
//    udp_send(Pcb1,p);
//    SysCtlDelay(SysCtlClockGet()/3);
  }


}

当在TCP&UDPdebug中发送:CONTROL LED ON时,会点亮开发板上的LED。并返回开发板的IP地址和MAC地址。

当我们发送的字符中含有:OFF时,就会关闭LED。

 

我这么做,是为了把几个重要的字符串处理函数都包括进来。其中它们基本上都在utils/ustdlib.c中,还有个别在string.h中引用。简单介绍下:

usprintf:是对标准的sprintf的改写,主要作用就是格式化打印字符串。

strncmp:C标准库中的字符串比较函数。

  用 法: int strncmp(char *str1, char *str2, int maxlen);

  说明:比较字符串str1和str2的大小,如果str1小于str2,返回值就<0,反之如果str1大于str2,返回值就>0,如果str1等于str2,返回值就=0,maxlen指的是str1与str2的比较的字符数。此函数功能即比较字符串str1和str2的前maxlen个字符。

ustrstr:也是对C库函数中的原来改写的,作用是在一个字符串中寻找另一个字符串。

在发送一个UDP数据报的时候,我们就分配一个合适大小的pbuf,但发送完了之后,记得释放它,否则发送的数据多了,会把RAM耗尽的,这就是为什么有的朋友会发现数据发送一段时间后,就自动停止发送了,内存用完了,能不停止吗?

 

 

 

 

[ 本帖最后由 academic 于 2010-12-2 17:53 编辑 ]
  • 1.jpg
点赞  2010-12-1 18:35

5楼 864 

IP那些数据不知道根据什么设置。那个测试软件如何使用等等还希望LZ好心普及下
点赞  2010-12-2 00:03

6楼 864 

另外请问GPIOPinTypeEthernetLED这个函数在哪个里面,我没找到,是驱动库不够新?谢谢

[ 本帖最后由 864 于 2010-12-2 00:19 编辑 ]
点赞  2010-12-2 00:11

回复 6楼 864 的帖子

在GPIO.c里边。这个测试工具有很多地方可以下载。

目标IP:就是我们数据要发送到的IP地址,这里一般情况下都是我们的开发板的IP地址。开发板的IP地址,常见的有静态方式,在程序中指定,DHCP分配的动态的,可能需要我们借助locator.c和finder来发现,或者用程序显示到OLED上。上面这个简单的程序中我采用的是静态IP地址,不难在上面找到它。当然你可以更改的。

目标端口:就是填写我们要把UDP或TCP数据报发送到的端口。一般是一些知名端口,或者自己在开发板程序里边指定的。

类型:UDP,TCP,UDP组播。前两个根据程序采用的哪种传输协议来选择,后一种我也不太清楚,反正我还没有通过它受到过组播的UDP,望高手指点啊。

基本就是这么个意思啊。

[ 本帖最后由 academic 于 2010-12-2 18:03 编辑 ]
点赞  2010-12-2 08:38
学习了
点赞  2010-12-2 12:26

9楼 864 

回复 7楼 academic 的帖子

非常感谢,今天继续学习LZ的例程,昨天睡觉前终于把LZ的例子瞎折腾出来了,我一开始新建工程的时候使用默认的startup.s会跑到硬fault里面,后来用开发板的lwip例子中的startup.s就好了,还没比较两者的差异。另外LZ说“7.最后别忘了复制一个lwipopts.h到工程当前文件夹下,它是配置lwip协议栈最重要的文件。”跑LZ的例子是需要怎么个配置法,我现在对以太网这块没概念,我想先跑LZ提供的例子做一个感性的认识。
点赞  2010-12-2 19:39

回复 9楼 864 的帖子


1.直接使用默认的Startup,这里要注意两个地方,一个是stack的大小,要设置足够大,因为协议栈嵌套调用的函数是比较多的一般为0x400.而是别忘了添加两个中断,一个是Systick的,一个是Ethernet的。
2.由于本例程中使用的UDP协议。所以,我们需要对复制的lwipopts.h修改一下,关闭不需要的功能,如TCP等,调整内存占用更小一些。
//#define HOST_TMR_INTERVAL               100         // default is 0
//#define DHCP_EXPIRE_TIMER_MSECS         (10 * 1000)
//#define INCLUDE_HTTPD_SSI
//#define INCLUDE_HTTPD_CGI
//#define DYNAMIC_HTTP_HEADERS
#define LWIP_TCP                        0
#define TCP_QUEUE_OOSEQ                 0

#define SYS_LIGHTWEIGHT_PROT            1           // default is 0
#define NO_SYS                          1           // default is 0
//#define MEMCPY(dst,src,len)             memcpy(dst,src,len)
//#define SMEMCPY(dst,src,len)            memcpy(dst,src,len)

//#define MEM_LIBC_MALLOC                 0
#define MEM_ALIGNMENT                   4           // default is 1
#define MEM_SIZE                        (1 * 1024)  // default is 1600
//#define MEMP_OVERFLOW_CHECK             0
//#define MEMP_SANITY_CHECK               0
//#define MEM_USE_POOLS                   0
//#define MEMP_USE_CUSTOM_POOLS           0

#define MEMP_NUM_PBUF                     0  // Default 16
这里为什么可以设置其为0,因为在上面的第二个例程中,所有要发送的数据都在RAM中,所以可以设置为0,并默认的16要少占用200多个字节的RAM。

#define PBUF_POOL_SIZE                   1//默认也是16,我们只是接受一个很少的UDP数据报的控制命令,并且用完即放。设置为1够用了。减少它的值可以的减少RAM占用。
这是几个主要的配置部分,配置是依赖于应用的,我们从最简单的应用开始分析,微调,还有很多地方需要去探讨,希望有知道的朋友分享你们的经验啊。
点赞  2010-12-3 09:25

回复 10楼 academic 的帖子

上面的这个例程我们是通过UDP来控制LED,很简单但应该是基础的东西了。
下面这个我在简单的写了一个简单的关于TCP服务端的例程,也是为了给初学者一点参考,比上边的UDP要稍微复杂一点,因为TCP协议本身为了保证数据传输的可靠就要比UDP复杂很多,要想稳定地,充分的利用TCP的这种优势,在设计应用层的时候肯定也相应地要复杂一些,当然,更重要的是,我们一定要尽量在理解透彻的基础上,去规范编程。只有按照规范来编程,你的TCP连接才会稳定,系统才会稳定,不至于出现了问题,找不到出错的地方,调试的时间远远大于开发的时间,如果一开始就规范地编程的话,到最后调试是很容易地。
下面这个例程,也是简单地以控制LED为例,这次采用的是可靠的TCP协议,如果有时间可以在这个基础之上,在逐步地去深入一下。
#include
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_nvic.h"
#include "inc/hw_types.h"
#include "inc/hw_sysctl.h"

#include "driverlib/ethernet.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/sysctl.h"
#include "driverlib/systick.h"
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h"


#include "utils/lwiplib.h"
#include "utils/ustdlib.h"

#include "lwip/tcp.h"


#define My_Mac_ID         {0X00,0x14,0x97,0x0F,0x1D,0xE3}  //存储以太网控制器的物理地址,即MAC地址

#define MY_IP_ID               {192,168,0,100}                   //以太网通信的IP地址
#define IP_MARK_ID           {255,255,255,0}                           //255.255.255.0,子网掩码
#define MY_GATEWAY_ID   {192,168,0,1}                     //以太网通信的网关地址
static const unsigned char pucMACAddress[]=My_Mac_ID;
static const unsigned char IPAddress[] = MY_IP_ID;
static const unsigned char NetMaskAddr[] = IP_MARK_ID;
static const unsigned char GwWayAddr[] = MY_GATEWAY_ID;
#define SYSTICKHZ                100
#define SYSTICKMS               (1000 / SYSTICKHZ)
#define SYSTICKUS               (1000000 / SYSTICKHZ)
#define SYSTICKNS               (1000000000 / SYSTICKHZ)

static struct tcp_pcb *g_psPCB = NULL;

typedef struct
{
    unsigned long ulRetryCount;               
    tBoolean bCONTROLSent;               
}
tAPPState;




void
SysTickIntHandler(void)
{
   
         lwIPTimer(SYSTICKMS);

}
//当数据被正确发送到远程主机后(收到ACK),该函数会被调用。
static err_t
App_sent(void *arg, struct tcp_pcb *pcb, u16_t len)
{
   LWIP_UNUSED_ARG(len);

  if(!arg) {
    return ERR_OK;
  }
    tcp_arg(pcb, NULL);
    tcp_sent(pcb, NULL);
    tcp_recv(pcb, NULL);
    mem_free(arg);
    tcp_close(pcb);

   
    return ERR_OK;

}

static err_t
APP_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
{

  tAPPState *pState;       
  pState = arg;
  if((err == ERR_OK) && (p != NULL))
    {
     tcp_recved(pcb, p->tot_len);
                         
                         if(strncmp(p->payload, "LED ON", 6) == 0)
        {
                         GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_PIN_0);
                         pbuf_free(p);
                         tcp_sent(pcb, App_sent);
                }
                         if(strncmp(p->payload, "LED OFF", 7) == 0)
        {
                         GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_0, 0);
                         pbuf_free(p);
                         tcp_sent(pcb, App_sent);
                }

//处理接收部分。

//发送数据
//  send_data();

    }

         if((err == ERR_OK) && (p == NULL))
    {
        //
        // Close the connection.
        //
        tcp_arg(pcb, NULL);
        tcp_sent(pcb, NULL);
        tcp_recv(pcb, NULL);
        mem_free(pState);
        tcp_close(pcb);
    }



    return ERR_OK;  
}

//static void
//APP_error(void *arg, err_t err)
//{
//   //处理错误
//    if(arg != NULL)
//    {
//        mem_free(arg);
//    }
//}

//static err_t
//APP_poll(void *arg, struct tcp_pcb *pcb)
//{
//    tAPPState *pState;
//
//   
//    pState = arg;
//
//  
//    pState->ulRetryCount++;
//
//   
//    if(pState->ulRetryCount++ >= 120)
//    {        //约120s之后无数据发送就会断开就断开连接。
//        tcp_abort(pcb);
//        return(ERR_ABRT);
//    }
//
//  
//    return ERR_OK;
//}


static err_t
APP_accept(void *arg, struct tcp_pcb *pcb, err_t err)
{
tAPPState *pState;
tcp_setprio(pcb, TCP_PRIO_MIN);
pState = mem_malloc(sizeof(tAPPState));
if(pState == NULL)
    {
        return(ERR_MEM);
    }
    pState->ulRetryCount = 0;
    pState->bCONTROLSent = false;

        tcp_arg(pcb, pState);

        tcp_recv(pcb, APP_recv);

//        tcp_err(pcb, APP_error);
        //这里设置2每500ms就调用一次。4就是1s
        //注意其中的APP_poll只有当协议栈中没有数据进出时,才会被调用。
        //我们可以用它来发送某些数据。
        //
//        tcp_poll(pcb, APP_poll, 4);
       
        return(ERR_OK);

}

void
io_init(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,GPIO_PIN_0);
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_0, 0);
}
int
main(void)
{
       
   struct ip_addr ulIPAddr,ulNetMask,ulGWAddr;
   struct tcp_pcb *Pcb1;

//   struct pbuf *p;

      if(REVISION_IS_A2)
    {
        SysCtlLDOSet(SYSCTL_LDO_2_75V);
    }

    SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
                   SYSCTL_XTAL_8MHZ);
          
    SysCtlPeripheralEnable(SYSCTL_PERIPH_ETH);
    SysCtlPeripheralReset(SYSCTL_PERIPH_ETH);

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    GPIOPinTypeEthernetLED(GPIO_PORTF_BASE, GPIO_PIN_2 | GPIO_PIN_3);

        io_init();       

    SysTickPeriodSet(SysCtlClockGet() / SYSTICKHZ);
    SysTickEnable();
    SysTickIntEnable();

    IntMasterEnable();
       
                IP4_ADDR(&ulIPAddr,IPAddress[3],IPAddress[2],IPAddress[1],IPAddress[0]);
        IP4_ADDR(&ulNetMask,NetMaskAddr[3],NetMaskAddr[2],NetMaskAddr[1],NetMaskAddr[0]);
        IP4_ADDR(&ulGWAddr,GwWayAddr[3],GwWayAddr[2],GwWayAddr[1],GwWayAddr[0]);
        lwIPInit(pucMACAddress,ulIPAddr.addr, ulNetMask.addr, ulGWAddr.addr, IPADDR_USE_STATIC);


    g_psPCB=Pcb1 = tcp_new();

    tcp_bind(Pcb1, IP_ADDR_ANY,1027);  //1027
    Pcb1 = tcp_listen(Pcb1);
    tcp_accept(Pcb1, APP_accept);  //

           while(1)
  {
  }


}
点赞  2010-12-4 18:35

简单说明一下,有几个函数在上面的程序中并没有用到,所以我注释了,但它们都是很有用的函数,如果在这个程序的基础上继续扩展的话,会用到它们,所以这里我提供一个使用lwIP应用层数据处理的一个基本框架,lwIP上大多数基于回调函数的应用基本上都是这样一个框架,这样可以保证我们的系统比较稳定。

1.jpg

[ 本帖最后由 academic 于 2010-12-4 18:45 编辑 ]
点赞  2010-12-4 18:36

回复 12楼 academic 的帖子

最近坛子有点冷清啊,我还是要坚持下去,努力实现当初申请板子时的目标,分享也是对我个人的一种鞭策,加深了对知识的理解,还能帮助到一些人,何乐而不为呢?
点赞  2010-12-4 19:00
引用: 原帖由 academic 于 2010-12-4 19:00 发表 最近坛子有点冷清啊,我还是要坚持下去,努力实现当初申请板子时的目标,分享也是对我个人的一种鞭策,加深了对知识的理解,还能帮助到一些人,何乐而不为呢?
嗯 加油! 谢谢分享
机遇总是给有准备的人呢
点赞  2010-12-4 22:50
顶。
只有想不到,没有做不到。
点赞  2010-12-5 13:19

回复 13楼 academic 的帖子

太感谢了 这两天回家了一趟,回来继续学习
点赞  2010-12-5 22:53

请教!

我想弄明白 这个 组播是怎么接收和发送的!
主机以组播地址发送出去,开发板(从机)再以组播地址发送回来,这个该怎么实现?
点赞  2010-12-6 15:39

回复 17楼 186874509 的帖子

好,这个接下来我会找个时间把我知道的写出来,给你参考一下。
点赞  2010-12-6 15:58
请问你这里用的是什么平台呀?
勇往直前,奋勇拼搏,不畏浮云遮望眼,直挂云帆济沧海
点赞  2010-12-6 21:43

回复 19楼 张无忌1987 的帖子

就是坛子里发放的LM3S8962
点赞  2010-12-7 08:37
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复