at32+free+rtos+lwip下,使用UDP通信作为网络的打印日志示例代码

lwip使用UDP通信作为网络的打印日志示例代码,参考代码如下

点击查看代码
//
#ifndef __UDP_Send_H
#define __UDP_Send_H

#include "lwip/udp.h"
#include "lwip/ip.h"
#include "lwip/netif.h"
#include "lwip/init.h"
#include "lwip/mem.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 140

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

#endif

/******************************************************************************/
//
#include "UDP_Send.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){
	}
	
	//数据回传
	udp_send(upcb, p);
	
	printf("%s\r\n",buf);
	
	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);
			 }
	 }
}

/******************************************************************************/

在初始化基本的内存池等等函数后进行udp_client_init();的初始化即可使用udp_client_send函数
例如:
LwIP_Init();
iperf_Server_init();
httpd_init();
udp_client_init();
for(;;)
{
    vTaskDelay((10));
}
![](https://img2024.cnblogs.com/blog/3487636/202407/3487636-20240719210356337-1485443486.png)

posted @ 2024-07-19 21:08  BUG_KING  阅读(104)  评论(0)    收藏  举报