gd32f4xx网络UDP丢包、多端口监听

1.查询网口连接

ARM嵌入式程序,在上电初始化网络口时,如果网线未连接,会导致初始化失败,后续网络又连上的依然是有问题,为修复该问题,程序逻辑上做了一下修改。在程序初始化时,一直等待网络连接,等待网线连接上以后在重新进行初始化操作。修改后代码如下:

enet_system_setup();
while(GetEnet_init_status()==0)
{
	 udelay(10000);
	 enet_system_setup();
}
if(GetEnet_init_status())
{
	/* initilaize the LwIP stack */
	lwip_stack_init();
	udp_echo_init();
}

2.多端口监听

一般情况下UDP通信,只需要一个端口,这时在程序里只需创建一个udp_pcb对象,但是如果监听两个,甚至更多端口需要创建多个pcb对象,示例代码如下所示:

udppcb55 = udp_new();
    //设置PCB连接到远程主机,并发送SYN段打开连接,如果连接没有绑定端口,则会为其自动分配一个端口。
	 //注册回调函数udp_echo_recv
    udp_recv(udppcb55,udp_echo_recv,NULL);
	
    udp_bind(udppcb55, IP_ADDR_ANY, 10055);
	 
	
	  udppcb56 = udp_new();
    
	
	   udp_recv(udppcb56,udp_echo_recv,NULL);
//	
//	  //设置PCB连接到远程主机,并发送SYN段打开连接,如果连接没有绑定端口,则会为其自动分配一个端口。
//	
    udp_bind(udppcb56, IP_ADDR_ANY, 10056);

注:udp_recv:注册接收回调函数,udp_bind:绑定监听本地端口,值注意的是udp_recv需要在udp_bind之前运行,以免在绑定好后,还没注册回调函数就有数据发送过来。

3.发包太快导致丢包问题解决

当上位机发送网络数据包较快时,ARM嵌入式程序会出现丢包情况,如果想解决该问题,需要修phy宏定义参数,修改涉及的代码如下:

/*!
    \file  gd32f4xx_enet.h
    \brief definitions for the ENET
*/

/*
    Copyright (C) 2016 GigaDevice

    2016-08-15, V1.0.3, firmware for GD32F4xx
*/

#ifndef GD32F4XX_ENET_H
#define GD32F4XX_ENET_H

#include "gd32f4xx.h"
#include <stdlib.h>

#define IF_USE_EXTERNPHY_LIB             0
#if (1 == IF_USE_EXTERNPHY_LIB)
#include "phy.h"
#endif

#ifndef ENET_RXBUF_NUM
#define ENET_RXBUF_NUM                   40U                                     /*!< ethernet Rx DMA descriptor number */
#endif
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蛮v蛮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值