3506|5

95

帖子

2

TA的资源

一粒金砂(中级)

楼主
 

STM32F207以太网+LAN8742传输服务器会卡死 [复制链接]

单片机作为服务器把数据传输到电脑客户端,客户端与服务器是一问一答的通讯方式,传输一段时间后服务器就会卡死,调试后发现卡死后服务器不会进入tcp_echoserver_recv函数
在网上搜了相关问题大多都说是这个接收函数的问题,自己就修改了几行数据接受和发送代码,大神看看问题出现在了那里

 static err_t tcp_echoserver_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{
  struct tcp_echoserver_struct *es;
  err_t ret_err;
        u16 i;

  LWIP_ASSERT("arg != NULL",arg != NULL);
  
  es = (struct tcp_echoserver_struct *)arg;
  
  /* if we receive an empty tcp frame from client => close connection */
  if (p == NULL)//空帧释放链接
  {
    /* remote host closed connection */
    es->state = ES_CLOSING;
    if(es->p == NULL)
    {
      /* we're done sending, close connection */
      tcp_echoserver_connection_close(tpcb, es);
                        transFlag = 0;
                        nextFlag = 0;
    }
    else
    {
      /* we're not done yet */
      /* acknowledge received packet */
      tcp_sent(tpcb, tcp_echoserver_sent);
      
      /* send remaining data*/
      tcp_echoserver_send(tpcb, es);
    }
    ret_err = ERR_OK;
  }   
  /* else : a non empty frame was received from client but for some reason err != ERR_OK */
  else if(err != ERR_OK)//非空,但是出错,释放缓存
  {
    /* free received pbuf*/
    if (p != NULL)
    {
      es->p = NULL;
      pbuf_free(p);
    }
    ret_err = err;
  }
  else if(es->state == ES_ACCEPTED)//连接成功,sent回调
  {
    /* first data chunk in p->payload */
    es->state = ES_RECEIVED;
    
    /* store reference to incoming pbuf (chain) */
    es->p = p;
    
    /* initialize LwIP tcp_sent callback function */
                  tcp_sent(tpcb, tcp_echoserver_sent);
                /* send back the received data (echo) */
                
                //20180322
                tcp_recved(tpcb, p->tot_len);                //yry20180322第一次连接时的数据
                memset(&serverRxBuf[serverRxCMDRecePos],0,serverRxCMDCount);
                memcpy(&serverRxBuf[serverRxCMDRecePos][0], p->payload, p->len);
                serverRxCMDRecePos++;
                serverRxCMDRecePos %= serverRxBufSize;                 
                
                //20190808                        
                tcp_echoserver_pcb = tpcb;
                pbuf_free(p);
    ret_err = ERR_OK;
  }
  else if (es->state == ES_RECEIVED)//收到数据
  {
    /* more data received from client and previous data has been already sent*/
                if(es->p == NULL)
    {
      es->p = p;
  
      /* send back received data */
                        
                tcp_recved(tpcb, p->tot_len);        
                memset(&serverRxBuf[serverRxCMDRecePos],0,serverRxCMDCount);
                memcpy(&serverRxBuf[serverRxCMDRecePos][0], p->payload, p->len);
                serverRxCMDRecePos++;
                serverRxCMDRecePos %= serverRxBufSize; 
                  pbuf_free(p);                        
                        //////////////////////
    }
    else//连接关闭,收到数据
    {
      struct pbuf *ptr;

      /* chain pbufs to the end of what we recv'ed previously  */
      ptr = es->p;
      pbuf_chain(ptr,p);
    }
    ret_err = ERR_OK;
  }
  
  /* data received when connection already closed */
  else
  {
    /* Acknowledge data reception */
    tcp_recved(tpcb, p->tot_len);
    
    /* free pbuf and do nothing */
    es->p = NULL;
    pbuf_free(p);
    ret_err = ERR_OK;
  }
  return ret_err;
}

 

[R1(1VLI3D%0KS`91H%OWBR.jpg (917.77 KB, 下载次数: 0)

服务器卡死界面

服务器卡死界面
此帖出自stm32/stm8论坛

最新回复

是不是路由器的回路有问题,网络问题先排除路由器因素。   详情 回复 发表于 2020-7-24 17:13
点赞 关注
 

回复
举报

17

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

这个提供的信息有点少,帮不上,帮顶

此帖出自stm32/stm8论坛
 
 

回复

95

帖子

2

TA的资源

一粒金砂(中级)

板凳
 

有没有人用过LAN8740网口芯片出现过这样的问题,晚上都说可能是底层内存占用释放不及时,卡死的,有么有人给咱提供一下具体的思路呢,卡着都好几天了!!

此帖出自stm32/stm8论坛
 
 

回复

310

帖子

5

TA的资源

一粒金砂(中级)

4
 

卡死是卡死在哪个函数,这个信息量太少了

 

此帖出自stm32/stm8论坛
 
 
 

回复

95

帖子

2

TA的资源

一粒金砂(中级)

5
 

 

抓包出现这种情况就会卡死

1593668914(1).jpg (55.7 KB, 下载次数: 0)

1593668914(1).jpg
此帖出自stm32/stm8论坛
 
 
 

回复

7452

帖子

2

TA的资源

五彩晶圆(高级)

6
 

是不是路由器的回路有问题,网络问题先排除路由器因素。

此帖出自stm32/stm8论坛
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表