OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3437|回复: 4

LWIP UDP通信,单片机作为服务端,接收数据

[复制链接]

25

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
468
金钱
468
注册时间
2017-6-10
在线时间
66 小时
发表于 2020-3-26 18:13:58 | 显示全部楼层 |阅读模式
1.使用STM32F4作为服务端,网络调试助手多次发送数据,服务端才能接受到数据,有哪位大神知道原因吗?下面是我的UDP配置与回调函数。@原子哥能够帮忙看一下吗?谢谢
//UDP测试
void udp_demo_test(void)
{
  err_t err;
struct udp_pcb *udppcb;   //定义一个TCP服务器控制块
struct ip_addr rmtipaddr;   //远端ip地址
u8 *tbuf;  
tbuf=mymalloc(SRAMIN,200); //申请内存
if(tbuf==NULL)return ;  //内存申请失败了,直接退出
udppcb=udp_new();
if(udppcb)//创建成功
{
  err=udp_bind(udppcb,IP_ADDR_ANY,UDP_DEMO_PORT);//绑定本地IP地址与端口号
  if(err==ERR_OK) //绑定完成
  {
   udp_recv(udppcb,udp_demo_recv,NULL);//注册接收回调函数
  }
}
else
{
  return;
}
if(udp_demo_flag&1<<6)//是否收到数据?
{
  udp_demo_senddata(udppcb);
  udp_demo_flag&=~(1<<6);//标记数据已经被处理了
  lwip_periodic_handle();
}

udp_demo_connection_close(udppcb);
myfree(SRAMIN,tbuf);

}

//UDP回调函数
void udp_demo_recv(void *arg,struct udp_pcb *upcb,struct pbuf *p,struct ip_addr *addr,u16_t port)
{
u32 data_len = 0;
struct pbuf *q;
if(p!=NULL) //接收到不为空的数据时
{
  memset(udp_demo_recvbuf,0,UDP_DEMO_RX_BUFSIZE);  //数据接收缓冲区清零
  for(q=p;q!=NULL;q=q->next)  //遍历完整个pbuf链表
  {
   //判断要拷贝到UDP_DEMO_RX_BUFSIZE中的数据是否大于UDP_DEMO_RX_BUFSIZE的剩余空间,如果大于
   //的话就只拷贝UDP_DEMO_RX_BUFSIZE中剩余长度的数据,否则的话就拷贝所有的数据
   if(q->len > (UDP_DEMO_RX_BUFSIZE-data_len)) memcpy(udp_demo_recvbuf+data_len,q->payload,(UDP_DEMO_RX_BUFSIZE-data_len));//拷贝数据
   else memcpy(udp_demo_recvbuf+data_len,q->payload,q->len);
   data_len += q->len;   
   if(data_len > UDP_DEMO_RX_BUFSIZE) break; //超出TCP客户端接收数组,跳出
  }
  upcb->remote_ip=*addr;     //记录远程主机的IP地址
  upcb->remote_port=port;     //记录远程主机的端口号
  lwipdev.remoteip[0]=upcb->remote_ip.addr&0xff;   //IADDR4
  lwipdev.remoteip[1]=(upcb->remote_ip.addr>>8)&0xff; //IADDR3
  lwipdev.remoteip[2]=(upcb->remote_ip.addr>>16)&0xff;//IADDR2
  lwipdev.remoteip[3]=(upcb->remote_ip.addr>>24)&0xff;//IADDR1
  udp_demo_flag|=1<<6; //标记接收到数据了
  pbuf_free(p);//释放内存
}else
{
  udp_disconnect(upcb);
  udp_demo_flag &= ~(1<<5); //标记连接断开
}
}
//UDP服务器发送数据
void udp_demo_senddata(struct udp_pcb *upcb)
{
struct pbuf *ptr;
ptr=pbuf_alloc(PBUF_TRANSPORT,strlen((char*)tcp_demo_sendbuf),PBUF_POOL); //申请内存
if(ptr)
{
  pbuf_take(ptr,(char*)tcp_demo_sendbuf,strlen((char*)tcp_demo_sendbuf)); //将tcp_demo_sendbuf中的数据打包进pbuf结构中
  udp_send(upcb,ptr); //udp发送数据
  pbuf_free(ptr);//释放内存

}
}
//关闭UDP连接
void udp_demo_connection_close(struct udp_pcb *upcb)
{
udp_disconnect(upcb);
udp_remove(upcb);   //断开UDP连接
udp_demo_flag &= ~(1<<5); //标记连接断开

}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

25

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
468
金钱
468
注册时间
2017-6-10
在线时间
66 小时
 楼主| 发表于 2020-3-27 11:43:38 | 显示全部楼层
为什么没有人回复啊,大神们
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2019-12-2
在线时间
32 小时
发表于 2020-4-1 15:23:20 | 显示全部楼层

回帖奖励 +1 金钱

是不是网络有延迟??你ping一下,看看时长
回复 支持 反对

使用道具 举报

25

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
468
金钱
468
注册时间
2017-6-10
在线时间
66 小时
 楼主| 发表于 2020-4-2 10:58:28 | 显示全部楼层
chenmc 发表于 2020-4-1 15:23
是不是网络有延迟??你ping一下,看看时长

不是,问题已经解决了,是因为我一直在初始化UDP。
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2020-6-24
在线时间
17 小时
发表于 2020-8-10 17:09:00 | 显示全部楼层
明天,你好 发表于 2020-4-2 10:58
不是,问题已经解决了,是因为我一直在初始化UDP。

一直在初始化udp是啥意思,是每次都要创建一个udppcb的意思吗
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 14:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表