• 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数据发送。

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

  • 相关阅读:
    第一冲刺阶段——站立会议第六天4月23日
    第一冲刺阶段——站立会议第五天4月22日
    第一冲刺阶段——站立会议第四天4月21日
    第一冲刺阶段——站立会议第三天4月20日
    第一冲刺阶段——站立会议第二天4月19日
    第一冲刺阶段——站立会议第一天4月18日
    WBS
    团队项目计划
    团队项目——班级派发布视频
    团队简介
  • 原文地址:https://www.cnblogs.com/mao0504/p/4706664.html
Copyright © 2020-2023  润新知