STM32 LWIP(裸机) RAW接口通讯——UDP API讲解(含源码)

LWIP

目录

LWIP移植:

参考(官网API讲解链接):

RAW UDP接口:

udp_new(创建UDP控制块)

udp_remove(移除UDP控制块)

udp_bind(UDP绑定IP及端口)

udp_connect(设置 PCB 的远程端)

udp_disconnect(移除 PCB 的远程端)

udp_recv(设置 UDP PCB 的接收回调)

udp_send(UDP发送函数)

UDP初始化源码(含:绑定IP、远程主机连接、回调函数)

UDP发送(源码)


LWIP移植:

手动移植LWIP(裸机):

                STM32H5 LWIP移植

基于CubeMX移植LWIP(裸机):

                STM32F4 LWIP移植

参考(官网API讲解链接):

https://www.nongnu.org/lwip/2_1_x/group__udp__raw.html

RAW UDP接口:

udp_new(创建UDP控制块)
API:

struct udp_pcb *

udp_new(void)

作    用:创建一个UDP控制快
参    数:
返回值:

udp_pcb :返回成功创建的UDP控制块

NULL:创建控制块失败

udp_remove(移除UDP控制块)
API:

void

udp_remove(struct udp_pcb *pcb)

作    用:移除一个UDP控制块,释放该控制块内存
参    数:pcb: 指定一个UDP控制块移除
返回值:

udp_bind(UDP绑定IP及端口)
API:

err_t

udp_bind(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port)

作    用:使UDP控制块绑定一个IP和端口
参    数:

pcb: 指定一个需要绑定的UDP控制块
ipaddr:要绑定的本地IP地址,使用IP_ANY_TYPE绑定到所有本地接口。

port:要绑定的本地 UDP 端口。使用 0 可自动绑定到 UDP_LOCAL_PORT_RANGE_START 和

UDP_LOCAL_PORT_RANGE_END 之间的随机端口

注意:iPaddr和端口应按照PCB中的字节顺序排列

返回值:

lwIP 错误代码

  ERR_OK:成功

  ERR_USE:指定的 ipaddr 和端口已经被另一个 UDP PCB 绑定到。

udp_connect(设置 PCB 的远程端)
API:

err_t

udp_connect(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port)

作    用:使UDP控制块连接一个为指定IP和端口的主机
参    数:

pcb: 指定一个需要连接的UDP控制块
ipaddr:要连接的远程 IP 地址

port:要连接的远程 UDP 端口

注意:iPaddr和端口应按照PCB中的字节顺序排列

如果尚未绑定,则 udp pcb 将绑定到随机本地端口

返回值:

lwIP 错误代码

udp_disconnect(移除 PCB 的远程端)
API:void
udp_disconnect(struct udp_pcb *pcb)
作    用:使UDP控制块断开连接
参    数:

pcb: 要断开连接的UDP PCB

返回值:

lwIP 错误代码

udp_recv(设置 UDP PCB 的接收回调)
API:void
udp_recv(struct udp_pcb *pcb, udp_recv_fn recv, void *recv_arg)
作    用:创建一个UDP接受回调函数
参    数:

pcb: 要为其设置 RECV 回调的 PCB

recv:回调函数的函数指针

recv_arg:传递给回调函数的附加参数

返回值:

udp_send(UDP发送函数)
API:err_t
udp_send(struct udp_pcb *pcb, struct pbuf *p)
作    用:使用UDP发送pbuf 
参    数:

pcb: 用于发送数据的 UDP PCB。

p:要发送的PBUF链

注意:数据报将被发送到当前remote_ip并remote_port存储在pcb中。如果 pcb 没有绑定到某个端口,它会自动绑定到一个随机端口。

返回值:lwIP 错误代码

        ERR_OK:成功。未发生错误

        ERR_MEM:内存不足

        ERR_RTE:找不到到目标地址的路由

        ERR_VAL:无 PCB 或 PCB 为双堆栈

注意:较低的协议层可能会返回更多错误

UDP初始化源码(含:绑定IP、远程主机连接、回调函数)

#define	 	U_DEST_IP_ADDR0 	xxx		//对方IP
#define 	U_DEST_IP_ADDR1 	xxx  
#define 	U_DEST_IP_ADDR2		xxx  
#define 	U_DEST_IP_ADDR3		xxx 

#define 	UDP_BIND_PORT		xxx	//监听端口	
#define		UDP_REMOTE_PORT		xxx	//发送端口



struct udp_pcb *upcb;	//UDP控制块
void UDP_Init()
{
	ip_addr_t remote_ip;	    //对方IP
	
	upcb = udp_new();        //创建UDP控制块
    /* IP_ADDR_ANY:该参数为 lwip移植时分配的IP */
	udp_bind(upcb,IP_ADDR_ANY,UDP_BIND_PORT);	//绑定IP、端口
	IP4_ADDR(&remote_ip,U_DEST_IP_ADDR0,U_DEST_IP_ADDR1,U_DEST_IP_ADDR2,U_DEST_IP_ADDR3); //设置由四个字节部分给出的IP地址
	udp_connect(upcb,&remote_ip,UDP_REMOTE_PORT);	//设置固定远端地址及端口
	udp_recv(upcb, udp_demo_recv, NULL); // 注册报文处理回调
}

/** 
 * @brief UDP服务器回调函数 
 * @param arg :传入的参数 
 * @param upcb:UDP控制块 
 * @param p : 网络数据包 
 * @param addr:远程主机IP地址 
 * @param port:远程主机端口号 
 * @retval 无 
 */
void udp_demo_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)
{
    uint32_t order;								//存放接收数据
   
    //将UDP接收到的消息保存 并释放内存
	order = ntohs(*(u16_t *)p->payload);
	memset(p->payload, 0 , p->tot_len);
	pbuf_free(p);
}

UDP发送(源码)

err_t UDP_Send_Data(struct udp_pcb *upcb,uint8_t *ad,uint32_t len)
{
	struct pbuf *ptr; //创建pbuf 
	err_t err;
	
	ptr = pbuf_alloc(PBUF_TRANSPORT,len,PBUF_POOL);	//申请内存
	if(ptr == NULL)  
	{
		return ERR_MEM;
	}
	memset(ptr->payload, 0 , ptr->len);		//清零
	memcpy((char*)ptr->payload, ad, len);	//数据
	err = udp_send(upcb,ptr);		//发送数据
	if(err != ERR_OK)
	{
		return ERR_ABRT;
	}
	memset(ptr->payload, 0 , ptr->len);
	pbuf_free(ptr);//释放内存

	return ERR_OK;
}

本文只介绍了部分常用UDP API 如果想了解更多API使用可去LWIP官网

有问题欢迎大家指正讨论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值