OpenEdv-开源电子网

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

lwip中netbuf数据读取问题

[复制链接]

12

主题

108

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1822
金钱
1822
注册时间
2017-9-7
在线时间
501 小时
发表于 2018-4-3 21:01:54 | 显示全部楼层 |阅读模式
20金钱
本帖最后由 亦辰 于 2018-4-3 21:03 编辑

[mw_shl_code=c,true]if((recv_err = netconn_recv(newconn,&recvbuf)) == ERR_OK)          //接收到数据
                                {               
    OS_CRITICAL_ENTER(); //关中断
    memset(tcp_server_recvbuf,0,TCP_SERVER_RX_BUFSIZE);  //数据接收缓冲区清零
   for(q=recvbuf->p;q!=NULL;q=q->next)  //遍历完整个pbuf链表
                                        {
    //判断要拷贝到TCP_SERVER_RX_BUFSIZE中的数据是否大于TCP_SERVER_RX_BUFSIZE的剩余空间,如果大于
   //的话就只拷贝TCP_SERVER_RX_BUFSIZE中剩余长度的数据,否则的话就拷贝所有的数据
      if(q->len > (TCP_SERVER_RX_BUFSIZE-data_len))
                  {
                      memcpy(tcp_server_recvbuf+data_len,q->payload,(TCP_SERVER_RX_BUFSIZE-data_len));//拷贝数据
                  }
     else
                  {
                     memcpy(tcp_server_recvbuf+data_len,q->payload,q->len);
                  }
  data_len += q->len;         
   if(data_len > TCP_SERVER_RX_BUFSIZE)
                  {
   break; //超出TCP客户端接收数组,跳出        
                                           }
               }
                                        OS_CRITICAL_EXIT();  //开中断
                                        data_len=0;  //复制完成后data_len要清零。        

                                        netbuf_delete(recvbuf);[/mw_shl_code]

最佳答案

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

1,不是,是一次只能传送这么多,剩下的下次传送。 2,高速也可以吧。看你MCU能力。 3,高速参考下我们的网络摄像头例程,基本上优化的还可以吧。你可以参考下。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2018-4-3 21:01:55 | 显示全部楼层
亦辰 发表于 2018-4-3 21:09
关于上述代码  有些疑问  一是:超出TCP客户端接收数组跳出那里 是指一旦超出,便有数据被遗弃了吗?   
  ...

1,不是,是一次只能传送这么多,剩下的下次传送。
2,高速也可以吧。看你MCU能力。
3,高速参考下我们的网络摄像头例程,基本上优化的还可以吧。你可以参考下。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

12

主题

108

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1822
金钱
1822
注册时间
2017-9-7
在线时间
501 小时
 楼主| 发表于 2018-4-3 21:09:15 | 显示全部楼层
关于上述代码  有些疑问  一是:超出TCP客户端接收数组跳出那里 是指一旦超出,便有数据被遗弃了吗?   
                                      二是:这样的读取数据方式只适用于低速数据收发吗?
                                      三:我想用该方式做高速数据收发,目前思路是乒乓操作,读取netbuf中数据,再对数据进行处理,具体该怎么处理呢 或者有别的思路可供参考吗?  先行谢过各位大佬
回复

使用道具 举报

12

主题

108

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1822
金钱
1822
注册时间
2017-9-7
在线时间
501 小时
 楼主| 发表于 2018-4-4 09:22:47 | 显示全部楼层
本帖最后由 亦辰 于 2018-4-4 09:59 编辑
正点原子 发表于 2018-4-3 21:01
1,不是,是一次只能传送这么多,剩下的下次传送。
2,高速也可以吧。看你MCU能力。
3,高速参考下我们 ...

原子哥,关于第一点还是想不通  从代码上看   for循环是遍历所有pbuf,而当超出后,跳出for循环,而后直接调用了netbuf_delete,那假设有剩余的数据,不是随着这个删除操作被丢了吗?  还是说lwip内核还有其他操作,并未体现呢///////////////////////////////////////////////////////
我又做了一次测试  将TCP_SERVER_RX_BUFSIZE大小设置为6  我连续发两次8个数据(01234567) 发现串口打印出来的是两次 0123456  若干次也都是这样  貌似并没有原子哥你说的剩下的下次
再发啊   还是我的理解仍有问题呢  相当疑惑啊

回复

使用道具 举报

12

主题

108

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1822
金钱
1822
注册时间
2017-9-7
在线时间
501 小时
 楼主| 发表于 2018-4-4 10:03:44 | 显示全部楼层
求帮助啊  @正点原子 @zuozhongkai   还有各位大侠  先行谢过了啊
回复

使用道具 举报

12

主题

108

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1822
金钱
1822
注册时间
2017-9-7
在线时间
501 小时
 楼主| 发表于 2018-4-26 09:15:24 | 显示全部楼层
正点原子 发表于 2018-4-3 21:01
1,不是,是一次只能传送这么多,剩下的下次传送。
2,高速也可以吧。看你MCU能力。
3,高速参考下我们 ...

原子哥,关于你说的下次传送应该是不成立的  当次传输完成后 netbuf是被删除了的,另外在下次数据来之后,对tcp_server_recvbuf又做了清零操作,所以该部分数据应该是被丢了的
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 20:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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