udp协议的数据接收与发送的代码 分类: VC++ 网络基础 2014-02-25 08:15 700人阅读 评论(0) 收藏

我想基于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数据发送。

 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

posted @ 2014-02-25 08:15  毛毛虫的薄刻  阅读(326)  评论(0编辑  收藏  举报