STM32F429 cubemx 配置以太网(DM9161) UDP通讯

STM32F429 cubemx 配置以太网(DM9161) UDP通讯_第1张图片
1.以太网接口,开启以太网
STM32F429 cubemx 配置以太网(DM9161) UDP通讯_第2张图片
3.修改引脚
STM32F429 cubemx 配置以太网(DM9161) UDP通讯_第3张图片
4.DM9161的参数配置可以选用例程中的DP83848
STM32F429 cubemx 配置以太网(DM9161) UDP通讯_第4张图片
5.开启IP协议,LWIP,配置静态IP, 使能UDP协议
STM32F429 cubemx 配置以太网(DM9161) UDP通讯_第5张图片
6.初始化生成代码
STM32F429 cubemx 配置以太网(DM9161) 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)数据收发
STM32F429 cubemx 配置以太网(DM9161) UDP通讯_第7张图片
11.配置PC端网口的网口IP
STM32F429 cubemx 配置以太网(DM9161) UDP通讯_第8张图片
STM32F429 cubemx 配置以太网(DM9161) UDP通讯_第9张图片

12.修改好了,烧录程序测试,打开windows命令窗口,ping 192.168.100.110,看能否ping通
STM32F429 cubemx 配置以太网(DM9161) UDP通讯_第10张图片
13.如果能ping 通,网口绿灯会闪烁,黄灯常亮
STM32F429 cubemx 配置以太网(DM9161) UDP通讯_第11张图片
14.打开网口调试助手,进行收发测试,其中设备(客户端)的端口和PC(服务器)的端口程序设置都为7,如果所示,PC端发送的数据都能接收并回调发送到PC
STM32F429 cubemx 配置以太网(DM9161) UDP通讯_第12张图片
15 进行设备端向PC发送数据测试
STM32F429 cubemx 配置以太网(DM9161) UDP通讯_第13张图片
13.其中UART_Proc()函数中通过发送数据,来使设备发送一个数据给PC
你也可以直接将udp_client_send()放在while(1)中一直发送数据给PC
STM32F429 cubemx 配置以太网(DM9161) UDP通讯_第14张图片
14.烧录程序测试,可以看到串口助手发送数据,网络助手可以收到设备发送过来的数据。PC端发送的数据也可以通过设备发送到串口助手上。
STM32F429 cubemx 配置以太网(DM9161) UDP通讯_第15张图片

你可能感兴趣的:(硬件开发,网络技术,计算机技术,udp,stm32,网络,单片机)