2013-01-06 5 views
1

나는 스텔라리스 ® LM3S6965 평가 보드 인 Cortex M3와 협력하고있다. NTP 서버에 UDP 패킷을 보내려고합니다. 나는 며칠이나 며칠을 찾고 있었다.UDP 패키지 (lwip, Cortex M3, 스텔라리스 LM3S6965 평가 보드) 보내기

하지만 작동하지 않습니다. 누군가 나를 도울 수 있습니까? callback 함수가 호출되지 않는 것 같아요. 프로그램의

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에 익숙하지 않지만 프로그램이 유휴 상태가되어 응답을 기다릴 수있는 "잠자기"호출이 있어야합니다. 콜백을 트리거하십시오.

UDP를 설정하려면 udp_init()과 같이 nitialization functions을 더 호출해야한다고 생각합니다.

+0

for 루프를 추가했습니다. 깨끗하지는 않지만 지금은 시간이 좀 걸립니다. for (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);