最近調試STM32 UDP功能的一些心得

最近調試STM32 UDP功能的一些心得

最近在研究STM32F107VC,由於某個任務需要用到UDP,就準備利用開發板結合LWip來實現該功能,但是在調試UDP的過程中,遇到了一些問題,在網上查找了半天,終於將基本的功能調通了。準備將過程記錄一下,以免日後忘記了。
硬件連接和Lwip的移植就不說了,請參照開發板給的例程。(我的原則是,能直接用的東西堅決不再去研究)微雪的板子給的例程是從官方的程序改的,看起來十分複雜,而且UDP功能介紹的十分模糊,參考性不強。於是網上找例程自己寫代碼。開始的時候,參考了網上的一些文章,第一次調試中關於UDP的初始化和發送部分是這樣的:

unsigned char const UDPArr[6] = {"hello!"}; 
int main(void)
{ 
  struct udp_pcb *Udppcb1;
  struct ip_addr ipaddr1;  
  struct pbuf *p ;
  /* Setup STM32 system (clocks, Ethernet, GPIO, NVIC) and STM3210C-EVAL resources */   
  System_Setup();               
  /* Initilaize the LwIP satck */   LwIP_Init(); 

  //測試UDP客戶端發送數據
  p = pbuf_alloc( PBUF_RAW , sizeof(UDPArr) , PBUF_RAM );
  p->payload = ( void *)(UDPArr);
  IP4_ADDR(&ipaddr1 , 192,168,1,11); 
  udppcb1 = udp_new( );  
  udp_bind( Udppcb1 , IP_ADDR_ANY , 161 );
  udp_connect( Udppcb1 , &ipaddr1 , 161 ) ;
  udp_send( Udppcb1 , p );        
  /* Infinite loop */       
  while (1)
  {     
    /* Periodic tasks */ 
    System_Periodic_Handle(); 
  }
}

編譯通過,但是利用網絡調試工具卻怎麼也抓不到發送的數據,這函數的返回值也沒有發現問題。
網上找的Udp代碼無法實現發送的功能,我後來又參考了一些別的文章,將代碼改成了這樣的形式,終於將UDP的發送與接收實現了。

int main(void)
{
  const u8 UDPArr[6] = {"Hello!"};
  struct udp_pcb *Udppcb1;
  struct ip_addr ipaddr1;
  struct pbuf *p;

  /* Setup STM32 system (clocks, Ethernet, GPIO, NVIC) and STM3210C-EVAL resources */
    System_Setup();

  /* Initilaize the LwIP satck */
    LwIP_Init();

    //HelloWorld_init();
    //httpd_init();
    //tftpd_init();

    p = pbuf_alloc(PBUF_TRANSPORT,sizeof(UDPArr),PBUF_ROM);
    p->payload = (void*)(UDPArr);
    IP4_ADDR(&ipaddr1,192,168,0,28);
    Udppcb1 = udp_new();
    udp_bind(Udppcb1,IP_ADDR_ANY,161);
    udp_recv(Udppcb1,UDP_Receive,NULL);
    udp_connect(Udppcb1,&ipaddr1,161);
    udp_send(Udppcb1,p);
    udp_disconnect(Udppcb1);
    pbuf_free(p);
    while (1)
    {    
    /* Periodic tasks */
      System_Periodic_Handle();

    }
}

最開始沒調通的時候,pbuf_alloc的第一個參數是PBUF_RAW,通信無法實現,改成PBUF_TRANSORT就可以了。
接收的函數如下:

void UDP_Receive(void *arg,struct udp_pcb *upcb,struct pbuf* p,struct ip_addr *addr,u16_t port)
{
    struct ip_addr dAddr = *addr;
    u16 length;
    u8 buf[255];

    if(p!=NULL)
    {
        //udp_sendto(upcb,p,&dAddr,port);
        //pbuf_free(p);
        Length =p->len;  //這裏取到的Length即爲收到的數據長度
        memcpy(buf,p->payload,length);      //將收到的報文拷貝至buf
        .....
        pbuf_free(p);

    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章