代码实现的是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);
}
}
}