lwip -- udp笔记1

代码实现的是udp客户端
主要是ping通之后的操作,包括接收数据解析,数据回传
参考:stm32+lwip(二):UDP测试

主机的ip地址和开发板的ip前3位要相同才能ping通
在这里插入图片描述

1、头文件

lwip我用的是正点原子的例程

#ifndef __UDP_DEMO_H
#define __UDP_DEMO_H

#include "netif/etharp.h"
#include "lwip/dhcp.h"
#include "lwip/init.h"
#include "ethernetif.h" 
#include "lwip/timers.h"
#include "lwip/ip_frag.h"
#include <string.h>
/*
//hal库所需的头文件
#include "lwip.h"
#include "udp.h"
#inclide "main.h"
#include "string.h"
*/

#define UDP_REMOTE_PORT    8089 /* 远端端口 */
#define UDP_LOCAL_PORT     8089 /* 本地端口 */

//远端地址
#define UDP_REMOTE_IP0 192
#define UDP_REMOTE_IP1 168
#define UDP_REMOTE_IP2 1
#define UDP_REMOTE_IP3 2

void udp_client_init(void);
void udp_client_send(char *pData);

#endif

2、实现

#include "udp_demo.h"
#include "led.h"
#include "usart.h"
/* udp控制块 */
static struct udp_pcb *upcb;

/******************************************************************************
* 描述  : 接收回调函数
******************************************************************************/
static void udp_receive_callback(void *arg, struct udp_pcb *upcb,
	 struct pbuf *p, const ip_addr_t *addr, u16_t port)
{
	char buf[1024]={0};

	//拷贝接收到的数据
	if(pbuf_copy_partial(p,(void *)buf,p->len,0)>0){
		LED0=!LED0;
	}
	
	//数据回传
	udp_send(upcb, p);
	
	printf("%s\r\n",buf);
	LED1=!LED1;

	pbuf_free(p);
}

/******************************************************************************
* 描述  : 发送udp数据
* 参数  : (in)pData 发送数据的指针
******************************************************************************/
void udp_client_send(char *pData)
{
	 struct pbuf *p;
	 
	 /* 分配缓冲区空间 */
	 p = pbuf_alloc(PBUF_TRANSPORT, strlen(pData), PBUF_POOL);
	 
	 if (p != NULL)
	 {
			 /* 填充缓冲区数据 */
			 pbuf_take(p, pData, strlen(pData));

			 /* 发送udp数据 */
			 udp_send(upcb, p);

			 /* 释放缓冲区空间 */
			 pbuf_free(p);
	 }
}

/******************************************************************************
* 描述  : 创建udp客户端
******************************************************************************/
void udp_client_init(void)
{
	 ip_addr_t serverIP;
	 err_t err;

	//接收端地址
	 IP4_ADDR(&serverIP,UDP_REMOTE_IP0,UDP_REMOTE_IP1,UDP_REMOTE_IP2,UDP_REMOTE_IP3);

	 /* 创建udp控制块 */
	 upcb = udp_new();

	 if (upcb!=NULL)
	 {
			 /* 配置本地端口 */
			 upcb->local_port = UDP_LOCAL_PORT;
			 
			 /* 配置服务器IP和端口 */
			 err= udp_connect(upcb, &serverIP, UDP_REMOTE_PORT);

			 if (err == ERR_OK)
			 {
				 /* 注册接收回调函数 */
				 udp_recv(upcb, (udp_recv_fn)udp_receive_callback, NULL);
				 
				 /* 发送udp数据 */
				 udp_client_send("udp client connected");
			 }
			 else
			 {
				 udp_remove(upcb);
			 }
	 }
}

3、运行截图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值