LWIP 以太网先启动后插入网线无法入网的解决办法

  1. 运行环境:系统RT-thread lwip2.0 mcu: GD32F470

  1. 问题描述:先插入网线后启动时以太网联网正常,但先启动,后插入网线时,无法入网。

  1. 原因:启动时若未插入网线,以太网初始化失败,虽然开启dhcp,但是无法分配dns及ip地址

  1. 解决办法:加入Link状态监测线程,关注网线link的变化,当检测到网线插入后,Link的状态未up,此时重新初始化emac。此时若dhcp开启,等待dhcp分配地址,分配到地址时,internet_state置为up。即可正常上网。

  1. 源码:

/*检测网线插入*/
#define LINK_CHECK_STACK_SIZE 256
#define LINK_CHECK_PRIORITY   RT_THREAD_PRIORITY_MAX/2
#define LINK_CHECK_TIMESLICE 20
static rt_thread_t tid1 = RT_NULL;
void thread_linkCheck_start(void)
{
    
    /* 初始化线程 thread_ptl_txt,名称是 ptltxt,入口是 thread_ptl_txt_entry */
    tid1=rt_thread_create("phy",
            eth_link_thread_entry,
            RT_NULL,
            LINK_CHECK_STACK_SIZE,
            LINK_CHECK_PRIORITY,
            LINK_CHECK_TIMESLICE);
    if(tid1!=RT_NULL)
    {
        rt_thread_startup(tid1);
    }
  }

static int GET_PHY_LINKState(uint8_t *linkstate)
{
    uint16_t phy_value = 0U;
    enet_phy_write_read(ENET_PHY_READ, PHY_ADDRESS, PHY_REG_BSR, &phy_value);
    phy_value &= PHY_LINKED_STATUS;
    *linkstate = phy_value>0? 1:0;
    return (*linkstate);
    
}
//eth动态监测任务入口函数
static void eth_link_thread_entry(void* parameter)
{
    uint8_t u8link_state_now = 0;                                                                   uint8_t u8link_state = 0;                                                                                                 
    struct netif* pnetif = gd32_emac_device0.parent.netif;                                                                                
    if (GET_PHY_LINKState(&u8link_state) != RT_TRUE)  
    {
            rt_kprintf("cant load link state\n");
    }
    if(u8link_state) 
    {
     u8link_state_now = 1;    
    }                                                                                                                                       
    while(1)
    {
            if (GET_PHY_LINKState(&u8link_state) != RT_TRUE)  //检测网线连接
            {
                //    rt_kprintf("cant load link state\n");
             }
     //网线接入 
         if((u8link_state == 0)&&(u8link_state_now == 1))                                 
         {
            u8link_state_now = 0;
        eth_device_linkchange(&gd32_emac_device0.parent, RT_FALSE); 
            LOG_W("link break\n");
          }
      //网线断开
          if((u8link_state == 1)&&(u8link_state_now == 0))                                       
          {
             u8link_state_now = 1;
         //重新配置MAC和DMA
//           phy_reset();
             gd32_emac_init((rt_device_t)&gd32_emac_device0);                                                               
#if !LWIP_DHCP
         pnetif->ip_addr = inet_addr(RT_LWIP_IPADDR);
         pnetif->gw = inet_addr(RT_LWIP_GWADDR);
         pnetif->netmask = inet_addr(RT_LWIP_MSKADDR);
#else
         IP4_ADDR(&(pnetif->ip_addr),0,0,0,0);                                     
       IP4_ADDR(&(pnetif->netmask),0,0,0,0);                                               
       IP4_ADDR(&(pnetif->gw),0,0,0,0);                 
#endif
         //若开启了DHCP,会自动执行
         eth_device_linkchange(&gd32_emac_device0.parent, RT_TRUE); 
         LOG_I("link on\n");
           }
           rt_thread_mdelay(1000);
    }
}



  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值