野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10607|回复: 7

lwip如何读取收到的完整数据包?

[复制链接]
发表于 2018-7-12 10:43:43 | 显示全部楼层 |阅读模式
STM32F429开发板,有个无操作系统移植LWIP的例程。PC机发送一个1000字节长度的包,开发板已经完整接收到(查看tot_len =1000), 但是接收程序仅仅接收了pbuf链表的第一个pbuf数据,只有460字节,而链表后面的pbuf数据没有接收??
static err_t tcp_echoclient_recv(void *arg,struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{
         char*recdata=0;
         
struct echoclient *es;
err_t ret_err;
  
LWIP_ASSERT("arg != NULL",arg != NULL);
  
  es= (struct echoclient *)arg;
         
  if(p == NULL)  // 远程主机关闭了连接
  {
     es->state = ES_CLOSING;
     if(es->pbuf_tx == NULL)
         tcp_echoclient_connection_close(tpcb, es);
     else
         tcp_echoclient_send(tpcb, es);
     
     ret_err = ERR_OK;
}   
else if(err != ERR_OK)  //接收到数据,但是有错误
  {
     pbuf_free(p);
     ret_err = err;
  }
else if(es->state == ES_CONNECTED)
  {
   tcp_recved(tpcb, p->tot_len); /* 总长度 */
   recdata=(char *)malloc(p->len*sizeof(char));// 仅仅第一个长度分配空间
                   if(recdata!=NULL)
                   {
                            memcpy(recdata,p->payload,p->len);// 仅仅COPY第一个pbuf ??
     #ifdef SERIAL_DEBUG
       if(recdata!=NULL)  printf("\r\n%s",recdata);//
     #endif  
     free(recdata);
                   }
   pbuf_free(p);
   ret_err = ERR_OK;
  }
else  /* data received whenconnection already closed */
  {
   tcp_recved(tpcb, p->tot_len); /* Acknowledge data reception */
   pbuf_free(p);  /* free pbuf and donothing */
   ret_err = ERR_OK;
  }
  return ret_err;
}

回复

使用道具 举报

发表于 2018-7-12 10:45:56 | 显示全部楼层
这些操作还是用socket来操作比较好,参考资料里的http例程。

用这些底层的函数来驱动太复杂了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-12 10:55:47 | 显示全部楼层
但是我现在无操作系统,不支持socket
回复 支持 反对

使用道具 举报

发表于 2018-7-12 11:18:45 | 显示全部楼层
wfy680 发表于 2018-7-12 10:55
但是我现在无操作系统,不支持socket

感觉可以移植一下,不然直接用那些函数真的好难写,当初就是看得糊里糊涂的
回复 支持 反对

使用道具 举报

发表于 2018-7-12 11:43:41 | 显示全部楼层
来看看学习一下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-12 16:04:50 | 显示全部楼层
相津童 发表于 2018-7-12 11:18
感觉可以移植一下,不然直接用那些函数真的好难写,当初就是看得糊里糊涂的

是的。我第一步想在没有OS的情况下实现,第二步在有OS的环境下编程。哪种OS系统比较方便,uCOS? OS+LWIP需要多大的空间?
回复 支持 反对

使用道具 举报

发表于 2018-7-13 09:18:39 | 显示全部楼层
大哥,是否需要遍历完整个pbuf链表
例如
struct pbuf *q;
for(q=p;q!=NULL;q=q->next)
回复 支持 反对

使用道具 举报

发表于 2018-10-19 10:35:02 | 显示全部楼层
jlldljt 发表于 2018-7-13 09:18
大哥,是否需要遍历完整个pbuf链表
例如
struct pbuf *q;

谢谢了大哥
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-1 11:58 , Processed in 0.034693 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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