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