你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F107+LWIP---如何检查tcp通讯断开?并重新连接

[复制链接]
青檬 提问时间:2012-1-16 14:32 /
目前本人整在使用STM32F107+LWIP+DP83848进行tcp通讯,如何判断网络已经连接成功或者网络是断开的?怎么样能够使STM32F107随时接入以太网都可以通讯
<
收藏 1 评论48 发布时间:2012-1-16 14:32

举报

48个回答
青檬 回答时间:2012-1-16 14:45:07

RE:STM32F107+LWIP---如何检查tcp通讯断开?并重新连接

void LwIP_Init(void)
{
  struct ip_addr ipaddr;        //IP地址
  struct ip_addr netmask;        //子掩码
  struct ip_addr gw;        //网关地址
  uint8_t macaddress[6]={0,0,0,0,0,1};  //以太网控制器物理地址,即MAC地址
  /* Initializes the dynamic memory heap defined by MEM_SIZE.*/
  mem_init();
  /* Initializes the memory pools defined by MEMP_NUM_x.*/
  memp_init();

#if LWIP_DHCP
  ipaddr.addr = 0;
  netmask.addr = 0;
  gw.addr = 0;
#else
  IP4_ADDR(&amp;ipaddr, 192, 168, 1, 200);
  IP4_ADDR(&amp;netmask, 255, 255, 255, 0);
  IP4_ADDR(&amp;gw, 192, 168, 1, 1);
#endif
  Set_MAC_Address(macaddress);
  /* - netif_add(struct netif *netif, struct ip_addr *ipaddr,
            struct ip_addr *netmask, struct ip_addr *gw,
            void *state, err_t (* init)(struct netif *netif),
            err_t (* input)(struct pbuf *p, struct netif *netif))
   
   Adds your network interface to the netif_list. Allocate a struct
  netif and pass a pointer to this structure as the first argument.
  Give pointers to cleared ip_addr structures when using DHCP,
  or fill them with sane numbers otherwise. The state pointer may be NULL.
  The init function pointer must point to a initialization function for
  your ethernet netif interface. The following code illustrates it's use.*/
  netif_add(&amp;netif, &amp;ipaddr, &amp;netmask, &amp;gw, NULL, &amp;ethernetif_init, &amp;ethernet_input);
  /*  Registers the default network interface.*/
  netif_set_default(&amp;netif);

#if LWIP_DHCP
  /*  Creates a new DHCP client for this interface on the first call.
  Note: you must call dhcp_fine_tmr() and dhcp_coarse_tmr() at
  the predefined regular intervals after starting the client.
  You can peek in the netif-&gt;dhcp struct for the actual DHCP status.*/
  dhcp_start(&amp;netif);
#endif
  /*  When the netif is fully configured this function must be called.*/
  netif_set_up(&amp;netif);
  tcp_client_init();
}
/**
  * @brief  Called when a frame is received
  * @param  None
  * @retval None
  */
void LwIP_Pkt_Handle(void)
{
  /* Read a received packet from the Ethernet buffers and send it to the lwIP for handling */
  ethernetif_input(&amp;netif);
}
/**
  * @brief  LwIP periodic tasks
  * @param  localtime the current LocalTime value
  * @retval None
  */
void LwIP_Periodic_Handle(__IO uint32_t localtime)
{
  /* TCP periodic process every 250 ms */
  if (localtime - TCPTimer &gt;= TCP_TMR_INTERVAL)
  {
    TCPTimer =  localtime;
    tcp_tmr();
  }
  /* ARP periodic process every 5s */
  if (localtime - ARPTimer &gt;= ARP_TMR_INTERVAL)
  {
    ARPTimer =  localtime;
    etharp_tmr();
  }
#if LWIP_DHCP
  /* Fine DHCP periodic process every 500ms */
  if (localtime - DHCPfineTimer &gt;= DHCP_FINE_TIMER_MSECS)
  {
    DHCPfineTimer =  localtime;
    dhcp_fine_tmr();
  }
  /* DHCP Coarse periodic process every 60s */
  if (localtime - DHCPcoarseTimer &gt;= DHCP_COARSE_TIMER_MSECS)
  {
    DHCPcoarseTimer =  localtime;
    dhcp_coarse_tmr();
  }
#endif
}
/**
  * @brief  LCD &amp; LEDs periodic handling
  * @param  localtime: the current LocalTime value
  * @retval None
  */
void Display_Periodic_Handle(__IO uint32_t localtime)
{
  /* 250 ms */
  if (localtime - DisplayTimer &gt;= LCD_TIMER_MSECS)
          {
                    DisplayTimer = localtime;
                        #if LWIP_DHCP
                    /* We have got a new IP address so update the display */
                    if (IPaddress != netif.ip_addr.addr)
                        {               
                              /* Read the new IP address */
                              IPaddress = netif.ip_addr.addr;                               
                              /* Display the new IP address */
                              if (netif.flags &amp; NETIF_FLAG_DHCP)
                                  {                                                 
                                            tcp_client_init();                                  
                                  }
                  
                          }
                    else if (IPaddress == 0)
                            {
               
                              /* If no response from a DHCP server for MAX_DHCP_TRIES times */
                                  /* stop the dhcp client and set a static IP address */
                                  if (netif.dhcp-&gt;tries &gt; MAX_DHCP_TRIES)
                              {
                                struct ip_addr ipaddr;
                                struct ip_addr netmask;
                                struct ip_addr gw;
                       
                                dhcp_stop(&amp;netif);
                       
                                IP4_ADDR(&amp;ipaddr, 192, 168, 1, 8);
                                IP4_ADDR(&amp;netmask, 255, 255, 255, 201);
                                IP4_ADDR(&amp;gw, 192, 168, 1, 1);
                       
                                netif_set_addr(&amp;netif, &amp;ipaddr , &amp;netmask, &amp;gw);
                              }
                            }
                        #endif
       
          }
}
青檬 回答时间:2012-1-16 14:45:35

RE:STM32F107+LWIP---如何检查tcp通讯断开?并重新连接

void tcp_client_init(void)
{
  struct tcp_pcb *tpcb;
  struct ip_addr ipaddr;
  IP4_ADDR(&amp;ipaddr, 192, 168, 1, 125);         //远程主机
  /* Create a new TCP control block  */
  tpcb = tcp_new();
  /* Assign to the new pcb a local IP address and a port number */
  tcp_bind(tpcb, IP_ADDR_ANY, TCP_PORT);
  /* Connect to the server: send the SYN */
  tcp_connect(tpcb, &amp;ipaddr, TCP_PORT, tcp_client_accept);
   
}
/**
  * @brief  This funtion is called when a TCP connection has been established on the port TCP_PORT.
  * @param  arg        user supplied argument
  * @param  pcb        the tcp_pcb which accepted the connection
  * @param  err error value
  * @retval ERR_OK
  */
err_t tcp_client_accept(void *arg, struct tcp_pcb *tpcb, err_t err)
{
  /* Specify the function that should be called when the TCP connection receives data */
  tcp_recv(tpcb, tcp_client_recv);
  return ERR_OK;  
}
/**
  * @brief  This function is called when a data is received over the TCP_PORT.
  *         The received data contains the number of the led to be toggled.
  * @param  arg        user supplied argument
  * @param  pcb        the tcp_pcb which accepted the connection
  * @param  p the packet buffer that was received
  * @param  err error value
  * @retval ERR_OK
  */
static err_t tcp_client_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{
   uint8_t Data_len;
  /* Inform TCP that we have taken the data. */
   tcp_recved(tpcb, p-&gt;tot_len);
   Data_len = p-&gt;len;
   memcpy(RX, p-&gt;payload, Data_len);
   tcp_write(tpcb,&amp;LocalDisplay,sizeof(LocalDisplay),1);       
  /* Free the p buffer */
   pbuf_free(p);
   return ERR_OK;
}
青檬 回答时间:2012-1-16 14:46:03

RE:STM32F107+LWIP---如何检查tcp通讯断开?并重新连接

上面是我写的程序,请高手指教!
青檬 回答时间:2012-1-16 14:49:53

RE:STM32F107+LWIP---如何检查tcp通讯断开?并重新连接

void LwIP_Init(void)
{
  struct ip_addr ipaddr;        //IP地址
  struct ip_addr netmask;        //子掩码
  struct ip_addr gw;        //网关地址
  uint8_t macaddress[6]={0,0,0,0,0,1};  //以太网控制器物理地址,即MAC地址
  /* Initializes the dynamic memory heap defined by MEM_SIZE.*/
  mem_init();
  /* Initializes the memory pools defined by MEMP_NUM_x.*/
  memp_init();

#if LWIP_DHCP
  ipaddr.addr = 0;
  netmask.addr = 0;
  gw.addr = 0;
#else
  IP4_ADDR(&amp;ipaddr, 192, 168, 1, 200);
  IP4_ADDR(&amp;netmask, 255, 255, 255, 0);
  IP4_ADDR(&amp;gw, 192, 168, 1, 1);
#endif
  Set_MAC_Address(macaddress);
  netif_set_default(&amp;netif);
#if LWIP_DHCP
  dhcp_start(&amp;netif);
#endif
  netif_set_up(&amp;netif);
  tcp_client_init();
}
void LwIP_Pkt_Handle(void)
{
  ethernetif_input(&amp;netif);
}
void LwIP_Periodic_Handle(__IO uint32_t localtime)
{
  /* TCP periodic process every 250 ms */
  if (localtime - TCPTimer &gt;= TCP_TMR_INTERVAL)
  {
    TCPTimer =  localtime;
    tcp_tmr();
  }
  /* ARP periodic process every 5s */
  if (localtime - ARPTimer &gt;= ARP_TMR_INTERVAL)
  {
    ARPTimer =  localtime;
    etharp_tmr();
  }
#if LWIP_DHCP
  if (localtime - DHCPfineTimer &gt;= DHCP_FINE_TIMER_MSECS)
  {
    DHCPfineTimer =  localtime;
    dhcp_fine_tmr();
  }
  if (localtime - DHCPcoarseTimer &gt;= DHCP_COARSE_TIMER_MSECS)
  {
    DHCPcoarseTimer =  localtime;
    dhcp_coarse_tmr();
  }
#endif
}
void Display_Periodic_Handle(__IO uint32_t localtime)
{
  if (localtime - DisplayTimer &gt;= LCD_TIMER_MSECS)
          {
                    DisplayTimer = localtime;
                        #if LWIP_DHCP
                    if (IPaddress != netif.ip_addr.addr)
                        {               
                              IPaddress = netif.ip_addr.addr;                               
                              if (netif.flags &amp; NETIF_FLAG_DHCP)
                                  {                                                 
                                            tcp_client_init();                                  
                                  }
                  
                          }
                    else if (IPaddress == 0)
                            {
               
                         if (netif.dhcp-&gt;tries &gt; MAX_DHCP_TRIES)
                              {
                                struct ip_addr ipaddr;
                                struct ip_addr netmask;
                                struct ip_addr gw;
                       
                                dhcp_stop(&amp;netif);
                       
                                IP4_ADDR(&amp;ipaddr, 192, 168, 1, 8);
                                IP4_ADDR(&amp;netmask, 255, 255, 255, 201);
                                IP4_ADDR(&amp;gw, 192, 168, 1, 1);
                       
                                netif_set_addr(&amp;netif, &amp;ipaddr , &amp;netmask, &amp;gw);
                              }
                            }
                        #endif
       
          }
}
青檬 回答时间:2012-1-16 14:51:07

RE:STM32F107+LWIP---如何检查tcp通讯断开?并重新连接

void tcp_client_init(void)
{
  struct tcp_pcb *tpcb;
  struct ip_addr ipaddr;
  IP4_ADDR(&amp;ipaddr, 192, 168, 1, 125);         //远程主机
  tpcb = tcp_new();
  tcp_bind(tpcb, IP_ADDR_ANY, TCP_PORT);
  tcp_connect(tpcb, &amp;ipaddr, TCP_PORT, tcp_client_accept);
   
}
err_t tcp_client_accept(void *arg, struct tcp_pcb *tpcb, err_t err)
{
  tcp_recv(tpcb, tcp_client_recv);
  return ERR_OK;  
}

static err_t tcp_client_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{
   uint8_t Data_len;
   tcp_recved(tpcb, p-&gt;tot_len);
   Data_len = p-&gt;len;
   memcpy(RX, p-&gt;payload, Data_len);
   tcp_write(tpcb,&amp;LocalDisplay,sizeof(LocalDisplay),1);       
   pbuf_free(p);
   return ERR_OK;
}
青檬 回答时间:2012-1-16 14:51:43

RE:STM32F107+LWIP---如何检查tcp通讯断开?并重新连接

怕大家看着眼花,我又整理了下程序。
回答时间:2012-1-16 15:05:06

RE:STM32F107+LWIP---如何检查tcp通讯断开?并重新连接

我也没有太多的用过TCP,不过你可以针对LWIP相关寄存器、TCP协议入手。应该有介绍处理TCP通讯的逻辑。
denton 回答时间:2012-1-18 10:42:12

回复:STM32F107+LWIP---如何检查tcp通讯断开?并重新连接

我也想知道,有没有人实现过?官方提供的启动板子时未连接网线超时后就没法连接了
denton 回答时间:2012-1-30 14:44:13

回复:STM32F107+LWIP---如何检查tcp通讯断开?并重新连接

看了一下...应该在ETH_Init函数里面
没有连上网线的话获取网络状态
ETH_ReadPHYRegister(PHYAddress, PHY_BSR) &amp; PHY_Linked_Status
返回值为0
12345下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版