STM32H743建立UDP通信,断电之后需要再次插拔网线才能重新建立UDP连接的问题解决办法

作者按照正点原子的网络通信的例程对UDP的收发进行了更改,发现UDP通信可用,但是在下电重新上电之后,网口虽然闪烁,但是最终无法建立有效的UDP通信连接

最终通过研究发现应该是使用了DHCP的问题,在LWIP初始化的时候,关掉DHCP就可以了,亲测可用

打开lwip初始化函数

			while(lwip_comm_init())         //lwip初始化
			{
			delay_ms(500);
			}

打开lan_8720_init函数

u8 lwip_comm_init(void)
{
    u8 retry=0;
	struct netif *Netif_Init_Flag;		//µ÷ÓÃnetif_add()º¯ÊýʱµÄ·µ»ØÖµ,ÓÃÓÚÅжÏÍøÂç³õʼ»¯ÊÇ·ñ³É¹¦
	struct ip_addr ipaddr;  			//ipµØÖ·
	struct ip_addr netmask; 			//×ÓÍøÑÚÂë
	struct ip_addr gw;      			//ĬÈÏÍø¹Ø 

    lwip_comm_default_ip_set(&lwipdev);	//ÉèÖÃĬÈÏIPµÈÐÅ
    while(LAN8720_Init())		        //³õʼ»¯LAN8720,Èç¹ûʧ°ÜµÄ»°¾ÍÖØÊÔ5´Î
    {
        retry++;
        if(retry>10) {retry=0;return 3;} //LAN8720³õʼ»¯Ê§°Ü
    }
	lwip_init();						//³õʼ»¯LWIPÄÚºË

#if LWIP_DHCP		//ʹÓö¯Ì¬IP
	ipaddr.addr = 0;
	netmask.addr = 0;
	gw.addr = 0;
#else				//ʹÓþ²Ì¬IP
	IP4_ADDR(&ipaddr,lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]);
	IP4_ADDR(&netmask,lwipdev.netmask[0],lwipdev.netmask[1] ,lwipdev.netmask[2],lwipdev.netmask[3]);
	IP4_ADDR(&gw,lwipdev.gateway[0],lwipdev.gateway[1],lwipdev.gateway[2],lwipdev.gateway[3]);
	printf("Íø¿¨enµÄMACµØַΪ:................%d.%d.%d.%d.%d.%d\r\n",lwipdev.mac[0],lwipdev.mac[1],lwipdev.mac[2],lwipdev.mac[3],lwipdev.mac[4],lwipdev.mac[5]);
	printf("¾²Ì¬IPµØÖ·........................%d.%d.%d.%d\r\n",lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]);
	printf("×ÓÍøÑÚÂë..........................%d.%d.%d.%d\r\n",lwipdev.netmask[0],lwipdev.netmask[1],lwipdev.netmask[2],lwipdev.netmask[3]);
	printf("ĬÈÏÍø¹Ø..........................%d.%d.%d.%d\r\n",lwipdev.gateway[0],lwipdev.gateway[1],lwipdev.gateway[2],lwipdev.gateway[3]);
#endif
	Netif_Init_Flag=netif_add(&lwip_netif,&ipaddr,&netmask,&gw,NULL,&ethernetif_init,&ethernet_input);//ÏòÍø¿¨ÁбíÖÐÌí¼ÓÒ»¸öÍø¿Ú
	
#if LWIP_DHCP			//Èç¹ûʹÓÃDHCPµÄ»°
	lwipdev.dhcpstatus=0;	//DHCP±ê¼ÇΪ0
	dhcp_start(&lwip_netif);	//¿ªÆôDHCP·þÎñ
#endif
	
	if(Netif_Init_Flag==NULL)return 4;//Íø¿¨Ìí¼Óʧ°Ü 
	else//Íø¿ÚÌí¼Ó³É¹¦ºó,ÉèÖÃnetifΪĬÈÏÖµ,²¢ÇÒ´ò¿ªnetifÍø¿Ú
	{
		netif_set_default(&lwip_netif); //ÉèÖÃnetifΪĬÈÏÍø¿Ú
		netif_set_up(&lwip_netif);		//´ò¿ªnetifÍø¿Ú
	}
	return 0;//²Ù×÷OK.
}   

最终将LWIP_DHCP的默认值从1更改为0

问题解决

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在STM32F4系列微控制器上使用Socket库来建立UDP(User Datagram Protocol)连接非常简单和方便。以下是一个简单的步骤说明: 1. 首先,我们需要在工程中添加相应的库文件,在使用Socket库之前,请确保已经添加了一个网络库,例如LwIP(Lightweight IP)库。 2. 接下来,我们需要创建一个UDP套接字,使用Socket库的`socket()`函数来实现。该函数返回一个套接字描述符,可用于之后的操作。 3. 设置套接字的属性,包括IP地址和端口号。这些属性将用于建立网络连接通信。 4. 使用`bind()`函数将套接字与本地IP地址和端口号绑定。 5. 可选地,可以使用`setsockopt()`函数设置套接字选项,例如超时时间等。 6. 使用`sendto()`函数向特定的远程IP地址和端口发送数据。 7. 使用`recvfrom()`函数从特定的远程IP地址和端口接收数据。 8. 最后,使用`closesocket()`函数关闭套接字。 需要注意的是,STM32F4系列微控制器上的Socket库可能有特定的函数命名和参数,具体的使用方式可以参考相关的文档和示例代码。此外,在使用Socket库之前,还需配置正确的网络设置,确保硬件能够正确连接网络。 总之,使用Socket库在STM32F4系列微控制器上建立UDP连接是非常简单和快速的,只需几个简单的函数调用即可完成手动建立和管理UDP连接。这样,我们可以在STM32F4上实现可靠的网络通信,以实现各种应用场景,如传感器数据采集和远程监控等。 ### 回答2: 使用STM32F4建立UDP连接可以通过以下步骤实现: 1. 配置网络参数:根据需要配置STM32F4板上的网络参数,包括IP地址、子网掩码、网关等。 2. 初始化通信模块:使用HAL库中的函数,例如`HAL_ETH_Init()`或`HAL_ETH_MspInit()`,来初始化以太网模块,确保模块能够正常工作。 3. 创建UDP套接字:使用`socket()`函数创建UDP套接字,并指定协议参数和端口号。例如,`socket(AF_INET, SOCK_DGRAM, 0);` 4. 绑定本地端口:使用`bind()`函数将UDP套接字与本地端口绑定。例如,`bind(sock, (struct sockaddr*)&local_addr, sizeof(local_addr));` 5. 设置远程IP地址和端口:使用`connect()`函数设置远程IP地址和端口,所有通过套接字发送的数据将会发送到这个远程地址。例如,`connect(sock, (struct sockaddr*)&remote_addr, sizeof(remote_addr));` 6. 发送数据:使用`sendto()`函数发送数据。例如,`sendto(sock, send_buf, send_buf_len, 0, (struct sockaddr*)&remote_addr, sizeof(remote_addr));` 7. 接收数据:使用`recvfrom()`函数接收数据,并指定存储接收数据的缓冲区和最大接收字节数。例如,`recvfrom(sock, recv_buf, MAX_RECV_BUF_SIZE, 0, (struct sockaddr*)&remote_addr, &addr_len);` 8. 关闭套接字:使用`close()`函数关闭套接字。例如,`close(sock);` 通过以上步骤,可以在STM32F4上建立一个UDP连接并实现数据的发送和接收。需要根据实际情况进行相应的参数配置,确保网络设置正确以及套接字的正常运行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值