栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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


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端发送的数据也可以通过设备发送到串口助手上。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/983638.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号