小弟最近才开始使用STM32CubeMX,在调试网口时,遇到问题,在此请各位大大,牛人帮帮忙。
我ETH,配为RMII模式:
使用LwIP,使用UDP,没有动态分配IP地址
除了修改了ip地址、子网掩码、网关,All LwIP Options 里面的选项都是默认的,没有进行修改。
初始化如下:
void udp_server_init(void)
{
Server_pcb = udp_new();
udp_bind(Server_pcb,IP_ADDR_ANY,UDP_LOCAL_PORT);
udp_recv(Server_pcb,udp_server_recv,NULL);
}
回调函数如下:收到有数据就放到接收数组中去,并将该收到的数据再回传原IP地址
void udp_server_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p,struct ip_addr *addr, u16_t port)
{
struct ip_addr destAddr = *addr;
uint8_t i;
if(p != NULL)
{
for(i=0;i<p->len;i++)
IP_Recv=*((uint8_t *)p->payload+i);
udp_sendto(Server_pcb,p,&destAddr,port);
}
pbuf_free(p);
}
这样接收和发送都没有问题,对每个IP地址发过来数据也都能马上将数据回传。
但当我想同时对多个IP地址进行发送时,总是第一个发送能成功,后面的发送都不能成功,本来自己对lwip就不熟悉,现在被这个问题困扰好几天都没有找到原因,只有在此求助各位大侠了。
struct pbuf *p = pbuf_alloc(PBUF_TRANSPORT,8,PBUF_RAM);
if(Other1_Connect == 1)
{
udp_sendto(Server_pcb,p,&Other1_addr,Other1_port);
Delay_m(5000);
}
//***************************************************************************
if(Other2_Connect == 1)
{
udp_sendto(Server_pcb,p,&Other2_addr,Other2_port);
Delay_m(5000);
}
以上程序是放到某一个定时器中断回调函数来执行的(1s中产生一个中断),Other1_Connect变量是在收到某一个ip地址来的数据后置1,Other2_Connect同样是。但问题就来了,如果Other1_Connect先置1,它能将p的内容发送给该地址,随后再对Other2_Connect置1,它对应的IP没有数据接收;如果Other2_Connect先置1,该地址能接收数据,但Other1_Connect随后置1,它对应的地址又接收不到数据。
有人说UDP连续发送之间应该有足够延时,不然不能正常发送,但我将Delay_m()已经改的足够大了,还是不能连续发送,还请各位大大赐教啊,小弟就先谢谢了。。。。
|