閱讀76 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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數據發送。

 

 

最後更新:2017-04-03 12:55:16

  上一篇:go 網絡子係統76_套接字綁定
  下一篇:go Linux下安裝awstats日誌統計分析