OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6241|回复: 10

探索者F407的LWIP如何在不重新上电的情况下修改IP地址

[复制链接]

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
发表于 2017-1-12 10:16:14 | 显示全部楼层 |阅读模式
5金钱
板子是探索者F407,用原子哥的综合实验程序,可以通过USMART修改IP、子网掩码、网关等参数,并把这些参数保存到FLASH,但想让这些参数生效目前只能是重启板子,这段时间想通过硬件、软件重启网卡的方式来实现新修改的IP能够生效,但结果都是失败。不是直接导致了内存溢出,就是重启之后无法再联网。配合着使用过的函数有LAN8720_Init()、lwip_comm_init()、netif_set_down()、netif_set_up(),在这些函数里对内存的申请也做了判断 ==NULL才申请内存,或者重启之前先释放内存,目前都无法正确实现。之前觉得先用netif_set_down(),然后用netif_set_addr()配置新的IP等参数,然后再netif_set_up(),这个思路应该是可以,但用了之后直接内存溢出。现在实在不明白该如何实现了,希望大神们可以指导一下。

最佳答案

查看完整内容[请看2#楼]

有乱码,还是贴图吧
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

21

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
624
金钱
624
注册时间
2014-11-11
在线时间
161 小时
发表于 2017-1-12 10:16:15 | 显示全部楼层
有乱码,还是贴图吧



1111

1111
回复

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
 楼主| 发表于 2017-1-12 10:24:12 | 显示全部楼层
补充一下,原子哥的netplay()我没有用到,在程序起来的时候就直接开了一个网络任务去初始化网卡那些,就是LAN8720_Init();,lwip_comm_init();然后发心跳包
回复

使用道具 举报

21

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
624
金钱
624
注册时间
2014-11-11
在线时间
161 小时
发表于 2017-1-13 09:49:09 | 显示全部楼层
[mw_shl_code=applescript,true]u8 Change_IPValue(u16 HIPADDR0,u16 LIPADDR0,u16 HIPADDR1,u16 LIPADDR1,u16 HPORT,u16 LPORT,u16 HNET0,u16 LNET0,u16 HNET1,u16 LNET1,u16 LDRIPADDR1)
{
        u8 retry=0;
  struct netif *Netif_Init_Flag;                //μ÷óÃnetif_add()oˉêyê±μÄ·μ»ØÖμ,óÃóúÅD¶ÏíøÂç3õê¼»ˉêÇ·ñ3é1|
        struct ip_addr ipaddr;                          //ipμØÖ·
        struct ip_addr netmask;                         //×óíøÑúÂë
        struct ip_addr gw;                              //ĬèÏíø1Ø
     
   u16 a,b,c,d,e,f,g,h,j,k,l;
   a = HIPADDR0;
   b = LIPADDR0;
   c = HIPADDR1;
   d = LIPADDR1;
   e = HPORT;
   f = LPORT;
   g = HNET0;
   h = LNET0;
   j = HNET1;
   k = LNET1;
   l = LDRIPADDR1;

  lwip_comm_ip_set(&lwipdev,a,b,c,d,e,f,g,h,j,k,l);  
  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("DÂíø¿¨enμÄMACμØÖ·Îa:................%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("D¾2ì¬IPμØÖ·........................%d.%d.%d.%d\r\n",lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]);
        printf("DÂ×óíøÑúÂë..........................%d.%d.%d.%d\r\n",lwipdev.netmask[0],lwipdev.netmask[1],lwipdev.netmask[2],lwipdev.netmask[3]);
        printf("DÂĬèÏíø1Ø..........................%d.%d.%d.%d\r\n",lwipdev.gateway[0],lwipdev.gateway[1],lwipdev.gateway[2],lwipdev.gateway[3]);
   
  netif_set_addr(&lwip_netif,&ipaddr,&netmask,&gw);
        return 0;//2ù×÷OK.
}[/mw_shl_code]
回复

使用道具 举报

21

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
624
金钱
624
注册时间
2014-11-11
在线时间
161 小时
发表于 2017-1-13 09:51:07 | 显示全部楼层
u8 Change_IPValue(u16 HIPADDR0,u16 LIPADDR0,u16 HIPADDR1,u16 LIPADDR1,u16 HPORT,u16 LPORT,u16 HNET0,u16 LNET0,u16 HNET1,u16 LNET1,u16 LDRIPADDR1)
{
        u8 retry=0;
  struct netif *Netif_Init_Flag;                //μ÷óÃnetif_add()oˉêyê±μÄ·μ»ØÖμ,óÃóúÅD¶ÏíøÂç3õê¼»ˉêÇ·ñ3é1|
        struct ip_addr ipaddr;                          //ipμØÖ·
        struct ip_addr netmask;                         //×óíøÑúÂë
        struct ip_addr gw;                              //ĬèÏíø1Ø
     
   u16 a,b,c,d,e,f,g,h,j,k,l;
   a = HIPADDR0;
   b = LIPADDR0;
   c = HIPADDR1;
   d = LIPADDR1;
   e = HPORT;
   f = LPORT;
   g = HNET0;
   h = LNET0;
   j = HNET1;
   k = LNET1;
   l = LDRIPADDR1;

  lwip_comm_ip_set(&lwipdev,a,b,c,d,e,f,g,h,j,k,l);  
  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("DÂíø¿¨enμÄMACμØÖ·Îa:................%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("D¾2ì¬IPμØÖ·........................%d.%d.%d.%d\r\n",lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]);
        printf("DÂ×óíøÑúÂë..........................%d.%d.%d.%d\r\n",lwipdev.netmask[0],lwipdev.netmask[1],lwipdev.netmask[2],lwipdev.netmask[3]);
        printf("DÂĬèÏíø1Ø..........................%d.%d.%d.%d\r\n",lwipdev.gateway[0],lwipdev.gateway[1],lwipdev.gateway[2],lwipdev.gateway[3]);
   
  netif_set_addr(&lwip_netif,&ipaddr,&netmask,&gw);
        return 0;//2ù×÷OK.
}
回复

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
 楼主| 发表于 2017-1-13 13:33:46 | 显示全部楼层
刺客mfl 发表于 2017-1-13 09:55
有乱码,还是贴图吧

大神就是厉害,困扰了我一周多的问题搞定了,修改完成之后,网页上直接输入IP就可以了,原来直接用netif_set_addr()这个函数就可以直接改,是自己想多了,一直想着要重启网卡什么的。对了,如果是要重启网卡的话,那有什么办法么?我现在是想着如果碰到某些极端情况的时候,在串口这边发指令让板子进行网卡重启,重启之后能够连上网络。目前对LWIP了解得不够深入,对于这一块还是挺头疼的
回复

使用道具 举报

21

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
624
金钱
624
注册时间
2014-11-11
在线时间
161 小时
发表于 2017-1-13 15:21:35 | 显示全部楼层
lzq12 发表于 2017-1-13 13:33
大神就是厉害,困扰了我一周多的问题搞定了,修改完成之后,网页上直接输入IP就可以了,原来直接用netif_ ...

这个没试过。。。。一直用上面的方法
回复

使用道具 举报

21

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
624
金钱
624
注册时间
2014-11-11
在线时间
161 小时
发表于 2017-1-13 15:21:53 | 显示全部楼层
lzq12 发表于 2017-1-13 13:33
大神就是厉害,困扰了我一周多的问题搞定了,修改完成之后,网页上直接输入IP就可以了,原来直接用netif_ ...

这个没试过。。。。一直用上面的方法
回复

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
 楼主| 发表于 2017-1-13 16:12:39 | 显示全部楼层
刺客mfl 发表于 2017-1-13 15:21
这个没试过。。。。一直用上面的方法

嗯嗯,谢谢大神啦
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2017-7-19
在线时间
2 小时
发表于 2017-8-21 14:27:37 | 显示全部楼层
lzq12 发表于 2017-1-13 13:33
大神就是厉害,困扰了我一周多的问题搞定了,修改完成之后,网页上直接输入IP就可以了,原来直接用netif_ ...

你好,楼主。用这个函数怎么netif_set_addr() 怎么去修改IP、网关和掩码?
回复

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
 楼主| 发表于 2017-8-21 16:57:39 | 显示全部楼层
Aoil39 发表于 2017-8-21 14:27
你好,楼主。用这个函数怎么netif_set_addr() 怎么去修改IP、网关和掩码?

struct ip_addr ipaddr;                          //ipμØÖ·
        struct ip_addr netmask;                         //×óíøÑúÂë
        struct ip_addr gw;                              //ĬèÏíø1Ø
IP4_ADDR(&ipaddr,ip1,ip2,ip3,ip4);
netif_set_addr(&lwip_netif,&ipaddr,&netmask,&gw);
大概这个样子就可以了,IP4_ADDR(&ipaddr,ip1,ip2,ip3,ip4);这个就是你要设置的数据了,参考一下原子哥的初始化函数就能理解了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-18 17:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表