Отправить пакет UDP (lwip, Cortex M3, оценочная плата Stellaris LM3S6965)

Я работаю с Cortex M3, оценочной платой Stellaris® LM3S6965. Я пытаюсь отправить пакет UDP на сервер NTP. Я искал дни и дни.

Но это не работает. Кто-нибудь может мне помочь? Я думаю, что функция обратного вызова не вызывается.

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


person Sharpless512    schedule 06.01.2013    source источник
comment
Пробовали ли вы код NTP со страницы LwIP Contrib --› git.savannah.gnu.org/cgit/lwip/lwip-contrib.git/tree/apps/sntp   -  person Ishmeet    schedule 17.10.2013


Ответы (2)


Я думаю, у тебя состояние гонки.

Вы регистрируете обратный вызов, но сразу после отправки пакета вы выходите из функции sendUDP(), что, в свою очередь, приводит к завершению main().

Вам нужно предоставить некоторое время, это могут быть сотни миллисекунд, прежде чем придет ответ, и вы никогда не ждете, пока это произойдет.

Я не знаком с eCosPro, которая, похоже, является операционной системой, которую вы используете, но должен быть какой-то «спящий» вызов, который просто позволяет вашей программе бездействовать и дает системе возможность прослушивать ответ и запускать обратный вызов.

Кроме того, я думаю, вам нужно больше вызывать iинициализацию функции, например udp_init(), для настройки поддержки UDP.

person unwind    schedule 06.01.2013
comment
Я добавил forloop, я знаю, что это не чисто, но теперь это дает ему некоторое время. for(idelay = 0; idelay < 3000000; idelay++); Этот код следует за udp_sendto(); и перед udp_recv(); Тот же результат - person Sharpless512; 06.01.2013

меняться от:

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

to:

udp_bind(pcb,&srcaddr,dst_port);
//udp_connect(pcb,&dstaddr,dst_port);
person Mike Li    schedule 12.11.2015