udp协议的数据接收与发送的代码

我想基于lwIP协议中的UDP协议,用单片机做一个服务器,接受电脑的指令然后返回数据。以下是我的代码

/****************************************************

*函数功能:初始化udp,选定通信端口,建立连接机制

****************************************************/

void Udp_Api_init(void)

{

  err_t err;

  struct udp_pcb *UDPpcb;

/* create a new UDP PCB structure  */

  UDPpcb = udp_new();

  if (!UDPpcb)

  {  /* Error creating PCB. Out of Memory  */

    return;

  }

/* Bind this PCB to port 99  */

  err = udp_bind(UDPpcb, IP_ADDR_ANY, service_port);

  if (err != ERR_OK)

  {    /* Unable to bind to port  */

    return;

  }

//通知协议栈当99端口有连接请求时调用recv_callback_udp

  udp_recv(UDPpcb, recv_callback_udp, NULL);

}

void recv_callback_udp(void *arg,struct udp_pcb *upcb, struct pbuf *pkt_buf,

                        struct ip_addr *addr,u16_t port)

{

  struct ip_addr dAddr = *addr;

  u8 data[5]={1,2,3,4,5};

  u8 *pValiData;

  

  struct pbuf *p ;

  struct ip_addr ipaddr;

  struct udp_pcb *UDPpcb1;

pValiData=pkt_buf->payload;

if( pkt_buf != NULL )

       {

          if(*pValiData > 0x05)   //接收到的指令码大于5,返回原指令

            udp_sendto( upcb , pkt_buf , &dAddr , port ) ;

  else

  {

          p = pbuf_alloc(PBUF_RAW,sizeof(data),PBUF_RAM);  //根据将要发送的数据大小开辟pbuf

                  p->payload=(void *)data;

  

                  IP4_ADDR(&ipaddr,192,168,1,2); 

                  UDPpcb1 = udp_new(); 

                  udp_bind(UDPpcb1,IP_ADDR_ANY,service_port);  //绑定本地IP 地址     

                  udp_connect(UDPpcb1,&ipaddr,1000); 

                  udp_send(UDPpcb1,p);

      //udp_remove(upcb);

            //udp_sendto( upcb , pkt_buf , &dAddr , port ) ;

   }

     }

     pbuf_free(pkt_buf);

}

实验结果:在发送指令大于5时,单片机返回数据5;但是当指令小于5时,没有返回值,且串口显示“HardFault_Handler”

            这是为什么呢???????????

void UDPceshi_recv(void *arg,struct udp_pcb *upcb, struct pbuf *pkt_buf,

                        struct ip_addr *addr,u16_t port)

  {

  struct ip_addr dAddr = *addr;

//  u8 data[5]={1,2,3,4,5};

 u8 *pValiData;

//  

//  struct pbuf *p ;

  struct ip_addr ipaddr;

  struct udp_pcb *UDPpcb;

pValiData=pkt_buf->payload;

if( pkt_buf != NULL )

       {

        

          //if(*pValiData > 0x05)   //接收到的指令码大于5,返回原指令

   //         udp_sendto( upcb ,pValiData , &ipaddr , 70 ) ;

//  else

//  {

//          p = pbuf_alloc(PBUF_RAW,sizeof(data),PBUF_RAM);  //根据将要发送的数据大小开辟pbuf

                //  p->payload=(void *)data;

  

                 // IP4_ADDR(&ipaddr,192,168,1,125); 

                  UDPpcb= udp_new(); 

                  udp_bind(UDPpcb,IP_ADDR_ANY,60);  //绑定本地IP 地址     

                  udp_connect(UDPpcb,&ipaddr,1000); 

                //  udp_send(UDPpcb1,p);

      //udp_remove(upcb);

            udp_sendto( upcb , pkt_buf , &dAddr , port ) ;

   }

pbuf_free(pkt_buf);

//    else

//    {

//      udp_remove(upcb);

//    }

}

{

 // uint8_t i=0;

  struct ip_addr destAddr = *addr;

  if(p != NULL)                          /* 如果收到的数据不为空   */            

  {

  

    //pbuf_copy_partial(p, UDPData, p->len, 0);       

    udp_sendto(upcb,p,&destAddr,port);                    /* 将收到的数据再发送出去 */           


    pbuf_free(p);                       /* 释放缓冲区数据 */

  }

}

我用PC机周期性地通过UDP给lm3s8962发数据,lm3s8962处理完后,再通过UDP发送给PC机。

无论PC机的周期设为多大,发现lm3s8962只能收到一半pc机发送的数据。

假如我分别创建两个UDP socket,一个用于UDP数据接收,一个用于UDP数据发送。接收和发送都正常。

请问下各位大侠,这是什么原因?先谢过了。

代码如下:

void UDPNetInit(void)

{

     struct ip_addr ipaddr1;

     IP4_ADDR(&ipaddr1,192,168,0,125);

    //

    // Start listening for incoming TFTP requests.

    //

    UDPpcb = udp_new();

    udp_recv(UDPpcb, UDPDataRecv, NULL);

    udp_bind(UDPpcb,IP_ADDR_ANY,UDPPRO_PORT);   /* 绑定本地IP地址 */

    udp_connect(UDPpcb,&ipaddr1,UDPPRO_PORT); /* 连接远程主机 */

}

UDPDataRecv函数用于UDP数据接收,在另外一个地方调用udp_send()作为UDP数据发送。

上一篇:c – 如何修复编译错误:非模板’iterator1’用作模板[复制]


下一篇:Win8.1+vs2012+osg环境搭建