发送UDP包(lwip、Cortex M3、Stellaris LM3S6965评估板)
我与Cortex M3、Stellaris®LM3S6965评估委员会合作。我正在尝试向NTP服务器发送UDP数据包。我已经找了好几天了 但它不起作用。有人能帮我吗?我认为回调函数没有被调用发送UDP包(lwip、Cortex M3、Stellaris LM3S6965评估板),c,udp,cortex-m3,lwip,C,Udp,Cortex M3,Lwip,我与Cortex M3、Stellaris®LM3S6965评估委员会合作。我正在尝试向NTP服务器发送UDP数据包。我已经找了好几天了 但它不起作用。有人能帮我吗?我认为回调函数没有被调用 int main(void){ sendUDP(); } void sendUDP(void){ //UDP struct ip_addr dstaddr; struct ip_addr srcaddr; struct udp_pcb * pcb; u16
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);
}
程序完整代码:我想你有比赛条件 您正在注册回调,但在发送数据包后,立即退出sendUDP函数,这反过来会导致main结束 您需要提供一些时间,在响应到来之前可能需要数百毫秒,而且您从不等待响应发生 我不熟悉eCosPro,它似乎是您正在使用的操作系统,但应该有一些睡眠调用,让您的程序空闲,让系统有机会侦听响应并触发回调 另外,我认为您需要调用更多的I,如udp_init来设置udp支持。更改为:
udp_bind(pcb,&srcaddr,&dst_port);
udp_connect(pcb,&dstaddr,&dst_port);
致:
我添加了一个forloop,我知道它不干净,但现在这给了它一些时间。foridelay=0;idelay<300万;idelay++;此代码在udp_sendto之后;在udp_recv之前;相同的结果是否尝试LwIP Contrib页面中的NTP代码->
udp_bind(pcb,&srcaddr,dst_port);
//udp_connect(pcb,&dstaddr,dst_port);