将UDP包发送到NTP服务器和接收时间(lwip、Cortex M3、Stellaris LM3S6965评估板)

nbnkbykc  于 2023-08-03  发布在  其他
关注(0)|答案(1)|浏览(148)

我正在与Cortex M3、Stellaris® LM 3S 6965评估板合作。我想在oled屏幕上显示NTP服务器的时间。首先,我想从NTP服务器获得回复。我搜索到服务器使用UDP。它给了我一个时间戳。我正在使用LWIP库。
我正试图向服务器发送一个UDP数据包,我想在显示器上显示收到的数据包数据(时间戳)。
所以我想我必须发送一个udp包到TNP服务器并接收时间戳。
但不知何故,它不工作。我希望你们能帮我找到解决办法。
编辑:
我还找到了一些关于NTP here的更多信息
更新程序:

// 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);
}

int main(void){
                //UDP
                struct udp_pcb * udp_con_new;
                struct ip_addr ntp_server;
                udp_con_new = udp_new();
                IP4_ADDR(&ntp_server,65,55,21,13); // time.windows.com
                udp_connect(udp_con_new,&ntp_server,123);

                struct pbuf * p;
                p = 0;

                udp_send(udp_con_new, p);

                //udp_recv(upcb,RecvUTPCallBack, recv_arg);

}

字符串

bt1cpqcv

bt1cpqcv1#

你没有发送任何数据。UDP是无连接的,udp_connect()函数的these random docs(似乎与您正在使用的内容匹配)如下:
此函数不会产生任何网络流量,而只是设置pcb的远程地址。
您必须为NTP构造一个有效的请求数据包,然后使用[udp_send()](http://www.ecoscentric.com/ecospro/doc/html/ref/lwip-api-raw-udp-send.html)发送。有关如何做到这一点的详细信息,以及您似乎需要的有关NTP的大量信息,请阅读current IEEE specification。好好享受吧。

相关问题