打印
[STM32F1]

lwip udp对不同ip地址发送数据问题

[复制链接]
3688|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lingyun20003|  楼主 | 2015-7-13 12:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟最近才开始使用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()已经改的足够大了,还是不能连续发送,还请各位大大赐教啊,小弟就先谢谢了。。。。
沙发
amanda_s| | 2015-7-14 17:03 | 只看该作者
在中断中的延时太长了吧。
把发送数据的函数放到中断外面来执行呢。
还有可以参考官方的udp_echo_server例程。

使用特权

评论回复
板凳
lingyun20003|  楼主 | 2015-7-15 13:54 | 只看该作者
amanda_s 发表于 2015-7-14 17:03
在中断中的延时太长了吧。
把发送数据的函数放到中断外面来执行呢。
还有可以参考官方的udp_echo_server例 ...

谢谢您的建议,我试试!

使用特权

评论回复
地板
lingyun20003|  楼主 | 2015-7-17 09:53 | 只看该作者
在amanda_s的建议下,我有看了看官方的udp_echo_server例程,将发送代码修改如下:

if(Other1_Connect == 1)
{
udp_connect(Server_pcb, &Other1_addr, Other1_port);

udp_sendto(Server_pcb,p,&Other1_addr,Other1_port);

udp_disconnect(Server_pcb);
Delay_m(500);
}
//***************************************************************************
if(Other2_Connect == 1)
{
udp_connect(Server_pcb, &Other2_addr, Other2_port);

udp_sendto(Server_pcb,p,&Other2_addr,Other2_port);

udp_disconnect(Server_pcb);

Delay_m(500);
}

现在可以正常发送数据了,但为什么修改后就可以了,还没有搞明白。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

11

帖子

0

粉丝