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
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("rn");
}
pbuf_free(p);
}
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_send(upcb_client, p);
pbuf_free(p);
}
}
void udp_client_init(void)
{
ip_addr_t serverIP;
err_t err;
IP4_ADDR(&serverIP, 192, 168, 100, 10);
upcb_client = udp_new();
if (upcb_client!=NULL)
{
upcb_client->local_port = UDP_LOCAL_PORT;
err= udp_connect(upcb_client, &serverIP, UDP_REMOTE_PORT);
if (err == ERR_OK)
{
udp_recv(upcb_client, udp_client_receive_callback, NULL);
udp_client_send((char *)"udp client connected");
printf("udp client connectedrn");
}
else
{
udp_remove(upcb_client);
printf("can not connect udp pcbrn");
}
}
}
//
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 UDP_CLIENT_PORT 7
struct udp_pcb *upcb_server;
uint8_t tcp_demo_sendbuf[80]="udp_test2022n";
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;
upcb_server = udp_new();
if (upcb_server)
{
err = udp_bind(upcb_server, IP_ADDR_ANY, UDP_SERVER_PORT);//连接指定IP,指定端口
if(err == ERR_OK)
{
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)
{
udp_connect(upcb, addr, UDP_CLIENT_PORT);
udp_send(upcb, p);
udp_disconnect(upcb);
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端发送的数据也可以通过设备发送到串口助手上。



