2013-01-06 26 views
1

我正在使用Cortex M3,Stellaris®LM3S6965評估板。我正在嘗試將UDP數據包發送到NTP服務器。我一直在尋找幾天和幾天。發送UDP包(lwip,Cortex M3,Stellaris LM3S6965評估板)

但它不工作。有人能幫我嗎?我認爲回調函數沒有被調用。節目的

int main(void){ 
    sendUDP(); 
} 

void sendUDP(void){ 

    //UDP 

    struct ip_addr dstaddr; 
    struct ip_addr srcaddr; 
    struct udp_pcb * pcb; 
    u16_t * dst_port; 
    struct pbuf * pb; 

    char str[512]="Test Sander"; 
    IP4_ADDR(&dstaddr,65,55,21,24); // time.windows.com 
    IP4_ADDR(&srcaddr,192,168,1,10); // cortex 
    dst_port = 123; 

    pcb = udp_new(); 

    RIT128x96x4Enable(1000000); 
    RIT128x96x4StringDraw("UDP CONNECT", 45, 45, 15); 

    udp_bind(pcb,&srcaddr,&dst_port); 
    udp_connect(pcb,&dstaddr,&dst_port); 

    pb = pbuf_alloc(PBUF_TRANSPORT, 512, PBUF_REF); 
    pb->payload = str; 
    pb->len = pb->tot_len = 512; 

    udp_sendto(pcb, &pb,&dstaddr,dst_port); 
    //udp_send(pcb, &pb); 

    udp_recv(pcb, RecvUTPCallBack, NULL); 

    pbuf_free(pb); 

    udp_remove(pcb); 


} 

// Function gets called when we recieve data 
err_t RecvUTPCallBack(void *arg, struct udp_pcb *upcb, struct pbuf *p, struct ip_addr *addr, u16_t port){ 
    RIT128x96x4Enable(1000000); 
    RIT128x96x4StringDraw("ENTERING CALLBACK", 40, 40, 11); 


    volatile int totaal_lengte=0; 
    totaal_lengte = p->tot_len; 
    volatile int line=40; 

    while(1){ 

     RIT128x96x4Enable(1000000); 
     RIT128x96x4StringDraw(p->payload+1, 0, line, 15); 
     line+=8; 
     if(p->len != p->tot_len){ 
      p=p->next; 
     } 
     else break; 
    } 
    pbuf_free(p); 
} 

全碼:http://codepaste.net/uuy8sg

+0

你從LwIP中的Contrib頁嘗試NTP代碼 - > http://git.savannah.gnu.org/cgit/lwip /lwip-contrib.git/tree/apps/sntp – Ishmeet

回答

1

我覺得你有一個競爭條件。

您正在註冊回調,但在發送數據包後立即退出sendUDP()功能,這反過來導致main()結束。

您需要提供一些時間,可能需要數百毫秒纔會出現響應,並且您從不等待它發生。

我對eCosPro並不熟悉,它似乎是您正在使用的操作系統,但應該有一些「睡眠」調用,讓您的程序閒置並讓系統有機會傾聽響應並觸發回調。

另外,我認爲你需要調用更多的我nitialization functions,像udp_init()成立UDP支持。

+0

我已經添加了一個forloop,我知道它不乾淨,但現在,它給了它一些時間。 (idelay = 0; idelay <3000000; idelay ++);' 此代碼在udp_sendto();和之前udp_recv();同樣的結果 – Sharpless512

-1

變化來自:

udp_bind(pcb,&srcaddr,&dst_port); 
udp_connect(pcb,&dstaddr,&dst_port); 

到:

udp_bind(pcb,&srcaddr,dst_port); 
//udp_connect(pcb,&dstaddr,dst_port);