1.以太网接口,开启以太网
3.修改引脚
4.DM9161的参数配置可以选用例程中的DP83848
5.开启IP协议,LWIP,配置静态IP, 使能UDP协议
6.初始化生成代码
7.添加UDP客户端的udp_client.c文件如下
#include "udp_client.h"
/* 定义端口号 */
#define UDP_REMOTE_PORT 7 /* 远端端口 */
#define UDP_LOCAL_PORT 7 /* 本地端口 */
/* udp控制块 */
static struct udp_pcb *upcb_client;
/******************************************************************************
* 描述 : 接收回调函数
* 参数 : -
* 返回 : 无
******************************************************************************/
static void udp_client_receive_callback(void *arg, struct udp_pcb *upcb,struct pbuf *p, const ip_addr_t *addr, u16_t port)
{
uint32_t i;
/* 数据回传 */
udp_send(upcb, p);//回传设备本身
// udp_sendto(upcb, p, addr, port);//
/***打印端口***/
printf("ip_server:%d:%d:%d:%d port:%d:\n",
*((uint8_t *)&addr->addr), *((uint8_t *)&addr->addr + 1),
*((uint8_t *)&addr->addr + 2), *((uint8_t *)&addr->addr + 3), port);
/* 打印接收到的数据 */
if (p != NULL)
{
struct pbuf *ptmp = p;
while(ptmp != NULL)
{
for (i = 0; i < p->len; i++)
{
printf("%c", *((char *)p->payload + i));
}
ptmp = p->next;
}
printf("\r\n");
}
/* 释放缓冲区数据 */
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_client, p);
/* 释放缓冲区空间 */
pbuf_free(p);
}
}
/******************************************************************************
* 描述 : 创建udp客户端
* 参数 : 无
* 返回 : 无
******************************************************************************/
void udp_client_init(void)
{
ip_addr_t serverIP;
err_t err;
IP4_ADDR(&serverIP, 192, 168, 100, 10);
/* 创建udp控制块 */
upcb_client = udp_new();
if (upcb_client!=NULL)
{
/* 配置本地端口 */
upcb_client->local_port = UDP_LOCAL_PORT;
/* 配置服务器IP和端口 */
err= udp_connect(upcb_client, &serverIP, UDP_REMOTE_PORT);
if (err == ERR_OK)
{
/* 注册接收回调函数 */
udp_recv(upcb_client, udp_client_receive_callback, NULL);
/* 发送udp数据 */
udp_client_send((char *)"udp client connected");
printf("udp client connected\r\n");
}
else
{
udp_remove(upcb_client);
printf("can not connect udp pcb\r\n");
}
}
}
///******************************** END OF FILE ********************************/
8.其中udp_client.h
#include "main.h"
#include "lwip.h"
#include "udp.h"
void udp_client_init(void);
void udp_client_send(char *pData);
9.其中udp_sever.c文件如下
#include "udp_server.h"
#define UDP_SERVER_PORT 7 /* define the UDP local connection port (电脑ip端口) */
#define UDP_CLIENT_PORT 7 /* define the UDP remote connection port(设备ip端口) */
struct udp_pcb *upcb_server;
uint8_t tcp_demo_sendbuf[80]="udp_test2022\n";
void udp_server_receive_callback(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port);
void udp_server_init(void)
{
err_t err;
/* Create a new UDP control block */
upcb_server = udp_new();
if (upcb_server)
{
/* Bind the upcb to the UDP_PORT port */
/* Using IP_ADDR_ANY allow the upcb to be used by any local interface */
err = udp_bind(upcb_server, IP_ADDR_ANY, UDP_SERVER_PORT);//连接指定IP,指定端口
if(err == ERR_OK)
{
/* Set a receive callback for the upcb */
udp_recv(upcb_server, udp_server_receive_callback, NULL);//注册接收回调函数,只要接收到数据,这个回调函数会被lwip内核调用
}
else
{
udp_remove(upcb_server);//断开UDP连接
}
}
}
void udp_server_receive_callback(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)
{
/* Connect to the remote client */
udp_connect(upcb, addr, UDP_CLIENT_PORT);
/* Tell the client that we have accepted it */
udp_send(upcb, p);
/* free the UDP connection, so we can accept new clients */
udp_disconnect(upcb);
/* Free the p buffer */
pbuf_free(p);
}
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);//释放内存
}
}
10.其中udp_server.h文件如下
#ifndef __ECHO_H__
#define __ECHO_H__
#include "main.h"
#include "lwip/pbuf.h"
#include "lwip/udp.h"
#include "lwip/igmp.h"
#include "lwipopts.h"
extern struct udp_pcb *upcb_server;
extern uint8_t tcp_demo_sendbuf[80];
void udp_server_init(void);
void udp_demo_senddata(struct udp_pcb *upcb);
#endif
10 在main.c中添加两个文件对应点的头文件
在main函数中添加对应的函数,测试PC端(server)数据收发
11.配置PC端网口的网口IP
12.修改好了,烧录程序测试,打开windows命令窗口,ping 192.168.100.110,看能否ping通
13.如果能ping 通,网口绿灯会闪烁,黄灯常亮
14.打开网口调试助手,进行收发测试,其中设备(客户端)的端口和PC(服务器)的端口程序设置都为7,如果所示,PC端发送的数据都能接收并回调发送到PC
15 进行设备端向PC发送数据测试
13.其中UART_Proc()函数中通过发送数据,来使设备发送一个数据给PC
你也可以直接将udp_client_send()放在while(1)中一直发送数据给PC
14.烧录程序测试,可以看到串口助手发送数据,网络助手可以收到设备发送过来的数据。PC端发送的数据也可以通过设备发送到串口助手上。