OpenEdv-开源电子网

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

STM32 F4 采用LWIP做TCP发送10k的数据怎么弄????

[复制链接]

10

主题

31

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2020-4-9
在线时间
17 小时
发表于 2020-4-13 20:29:03 | 显示全部楼层 |阅读模式
8金钱
采用的是STM32 F407的板子,板子作为客户端,上位机电脑为服务器。客户端这边要发送10K个字节,这边我分为10包发送,每一包1000个字节,但是要在20ms内完成;测试发现,根本发送不了,而只留1包数据(1000个字节,20ms内发送)则没有问题,请问各位发送这种大数据的TCP是怎么做的???求经验啊

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

31

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2020-4-9
在线时间
17 小时
 楼主| 发表于 2020-4-14 13:55:43 | 显示全部楼层
求大神解答啊,我现在一旦连续发送数据就,write函数就会返回ERR_MEM,我查了一下,这个表示内存低,但是我修改了内存
#define TCP_MSS                 (1500 - 40)          /* TCP_MSS = (Ethernet MTU - IP header size - TCP header size) */

/* TCP sender buffer space (bytes). */
#define TCP_SND_BUF             (50*TCP_MSS)//32
都这么大了还低么?
回复

使用道具 举报

10

主题

31

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2020-4-9
在线时间
17 小时
 楼主| 发表于 2020-4-14 15:12:56 | 显示全部楼层
查询后发现我卡在这里 could not allocate memory for pbuf copy size %"U16_F"\n",请问各位大神,这是啥意思
回复

使用道具 举报

10

主题

31

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2020-4-9
在线时间
17 小时
 楼主| 发表于 2020-4-14 15:19:20 | 显示全部楼层
if ((p = tcp_pbuf_prealloc(PBUF_TRANSPORT, seglen + optlen, mss_local, &oversize, pcb, apiflags, queue == NULL)) == NULL) {
        LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_write : could not allocate memory for pbuf copy size %"U16_F"\n", seglen));
        goto memerr; 这个函数让我发送不出去
回复

使用道具 举报

14

主题

204

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2443
金钱
2443
注册时间
2017-9-13
在线时间
559 小时
发表于 2020-4-14 17:19:57 | 显示全部楼层
wangxinli2 发表于 2020-4-14 13:55
求大神解答啊,我现在一旦连续发送数据就,write函数就会返回ERR_MEM,我查了一下,这个表示内存低,但是我 ...

TCP_SND_BUF 是发送缓冲区大小,不是内存,提示内存不足,应该改内存池
回复

使用道具 举报

10

主题

31

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2020-4-9
在线时间
17 小时
 楼主| 发表于 2020-4-14 18:52:43 | 显示全部楼层
HCHDaLeiGe 发表于 2020-4-14 17:19
TCP_SND_BUF 是发送缓冲区大小,不是内存,提示内存不足,应该改内存池

感谢您的回复,可能是我描述错误,目前定位就是连续调用发送函数会卡死,但是我不太理解,我已经采用tcp_write 紧跟着tcp_output,为什么还是会出现问题。下一个帖子会附带我的发送代码。
回复

使用道具 举报

10

主题

31

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2020-4-9
在线时间
17 小时
 楼主| 发表于 2020-4-14 18:53:37 | 显示全部楼层
附上 发送代码

static void tcp_echoclient_send(struct tcp_pcb *tpcb, struct echoclient * es)
{
  struct pbuf *ptr;
  err_t wr_err = ERR_OK;

  while ((wr_err == ERR_OK) &&
         (es->p_tx != NULL) &&
         (es->p_tx->len <= tcp_sndbuf(tpcb)))  //tcp_sndbuf ·¢&#203;í3¤&#182;裨&#187;o3&#229;&#199;&#248;&#196;ü′&#230;·&#197;μ&#196;3¤&#182;è£&#169;
  {
    /* get pointer on pbuf from es structure */
    ptr = es->p_tx;

    /* enqueue data for transmission */
    wr_err = tcp_write(tpcb, ptr->payload, ptr->len, 1); //&#189;&#171;·¢&#203;íêy&#190;Y&#188;óè&#235;&#182;óáD
   
    if (wr_err == ERR_OK)
    {
                        u8 freed;
      /* continue with next pbuf in chain (if any) */
      es->p_tx = ptr->next;
      
      if(es->p_tx != NULL)
      {
        /* increment reference count for es->p */
        pbuf_ref(es->p_tx);
      }               
      /* free pbuf: will free pbufs up to es->p (because es->p has a reference count > 0) */
       do
      {
        /* try hard to free pbuf */
        freed = pbuf_free(ptr);
      }
      while(freed == 0);
                        tcp_recved(tpcb, ptr->len);
    }
   else if(wr_err == ERR_MEM)
   {
      /* we are low on memory, try later, defer to poll */
     es->p_tx = ptr;
                 tcp_output(tpcb);
//                  pbuf_free(ptr);
   }
   else
   {
     /* other problem ?? */
   }
          tcp_output(tpcb);
  }
}

u8_t tcp_send_message(void *msg, uint16_t len)
{
        tcp_size_buf = tcp_sndbuf(es->pcb);
                if(tcp_connected_flag == 1)
                {       
      es->p_tx  = pbuf_alloc(PBUF_TRANSPORT,len,PBUF_RAM);        
      pbuf_take( es->p_tx ,msg , len);  
      tcp_echoclient_send(es->pcb, es);
    }
    return 1;
}
回复

使用道具 举报

10

主题

31

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2020-4-9
在线时间
17 小时
 楼主| 发表于 2020-4-14 18:54:48 | 显示全部楼层
wangxinli2 发表于 2020-4-14 18:53
附上 发送代码

static void tcp_echoclient_send(struct tcp_pcb *tpcb, struct echoclient * es)

连续调用tcp_send_message(void *msg, uint16_t len)函数就会出现卡死的情况(尽在数据量很大的时候,例如10ms内我调用4次这个函数,每一次发送1000个字节)
回复

使用道具 举报

2

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2020-3-19
在线时间
23 小时
发表于 2020-7-29 15:38:57 | 显示全部楼层
楼主解决了吗
回复

使用道具 举报

10

主题

31

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2020-4-9
在线时间
17 小时
 楼主| 发表于 2020-9-6 22:07:47 | 显示全部楼层

解决了,是服务器端的问题,那边接收不够快的话,我这边就会缓存溢出,直至崩溃
回复

使用道具 举报

10

主题

25

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1098
金钱
1098
注册时间
2018-8-10
在线时间
150 小时
发表于 2020-9-7 17:19:06 | 显示全部楼层
wangxinli2 发表于 2020-9-6 22:07
解决了,是服务器端的问题,那边接收不够快的话,我这边就会缓存溢出,直至崩溃

楼主电脑端上位机是用的调试助手吗?
回复

使用道具 举报

10

主题

31

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2020-4-9
在线时间
17 小时
 楼主| 发表于 2020-9-7 17:36:52 | 显示全部楼层
kkkkklsq 发表于 2020-9-7 17:19
楼主电脑端上位机是用的调试助手吗?

是的,网上下载的,
回复

使用道具 举报

10

主题

25

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1098
金钱
1098
注册时间
2018-8-10
在线时间
150 小时
发表于 2020-9-8 08:55:27 | 显示全部楼层
wangxinli2 发表于 2020-9-7 17:36
是的,网上下载的,

如果是服务器端的问题,那您最后是怎样测试验证的呢?是换了一个上位机软件吗?
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2022-2-26
在线时间
5 小时
发表于 2022-11-17 14:52:19 | 显示全部楼层
我也是遇上了同样的报错啊
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 23:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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