14925|17

72

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

LWIP超过200字节数据接收乱码 [复制链接]

在用Lwip接收SOCKET调试工具发送的超过200字节数组给LM3s8962处理时,200字节以后的数据出现乱码问题:

 

过程:

用SOCKET工具发送0123456789的序列,如图SocketData1.jpg:

 

现象:

在 Keil中调试信息,如图SocketData2.jpg:

 

求解:

是不是Lwip中要对Pbuf大小进行设置?怎么处理这个问题?

SocketData1.JPG (28.75 KB, 下载次数: 3)

SocketData1.JPG

SocketData2.JPG (84.73 KB, 下载次数: 1)

SocketData2.JPG

最新回复

#define MEM_SIZE                        (24 * 1024)  // default is 1600, was 16K 默认 1600  怎么会是16K呢???  (1600/1024) K   不是这样的吗??  详情 回复 发表于 2015-3-24 16:09
 
点赞 关注(1)

回复
举报

72

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

又发现一个现象:如图SocketData3.JPG

在第216个字节处,接收数据又正常了。跑了几次都是这个现象。

SocketData3.JPG (24.05 KB, 下载次数: 0)

SocketData3.JPG
 
 

回复

918

帖子

0

TA的资源

纯净的硅(中级)

板凳
 

回复 沙发 h0nly_zhang 的帖子

把 lwipopt.h贴出来看看
 
 
 

回复

2641

帖子

0

TA的资源

五彩晶圆(中级)

4
 
你的接收处理有问题,LWIP接收把数据分成一段一段的,每段根据TCP UDP的不同在200多个字节不定,你要分段接收,发送底层也是一样的
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(中级)

5
 

我的lwipopts.h

 

//*****************************************************************************

#ifndef __LWIPOPTS_H__
#define __LWIPOPTS_H__

 

//*****************************************************************************
//
// ---------- Platform specific locking ----------
//
//*****************************************************************************
#define SYS_LIGHTWEIGHT_PROT            1           // default is 0
#define NO_SYS                          1           // default is 0
//#define MEMCPY(dst,src,len)             memcpy(dst,src,len)
//#define SMEMCPY(dst,src,len)            memcpy(dst,src,len)

//*****************************************************************************
//
// ---------- Memory options ----------
//
//*****************************************************************************
//#define MEM_LIBC_MALLOC                 0
#define MEM_ALIGNMENT                   4           // default is 1
#define MEM_SIZE                        (24 * 1024)  // default is 1600, was 16K
//#define MEMP_OVERFLOW_CHECK             0
//#define MEMP_SANITY_CHECK               0
//#define MEM_USE_POOLS                   0
//#define MEMP_USE_CUSTOM_POOLS           0

//*****************************************************************************
//
// ---------- Internal Memory Pool Sizes ----------
//
//*****************************************************************************
#define MEMP_NUM_PBUF                     48    // Default 16, was 16
#define MEMP_NUM_RAW_PCB                  4
//#define MEMP_NUM_UDP_PCB                  4
#define MEMP_NUM_TCP_PCB                  16    // Default 5, was 12
#define MEMP_NUM_TCP_PCB_LISTEN           8
#define MEMP_NUM_TCP_SEG                  16
//#define MEMP_NUM_REASSDATA              5
//#define MEMP_NUM_ARP_QUEUE              30
//#define MEMP_NUM_IGMP_GROUP             8
//#define MEMP_NUM_SYS_TIMEOUT              3
//#define MEMP_NUM_NETBUF                   2
//#define MEMP_NUM_NETCONN                  4
//#define MEMP_NUM_TCPIP_MSG_API          8
//#define MEMP_NUM_TCPIP_MSG_INPKT        8
#define PBUF_POOL_SIZE                    16    // Default 16, was 36

//*****************************************************************************
//
// ---------- IP options ----------
//
//*****************************************************************************
//#define IP_FORWARD                      0
//#define IP_OPTIONS_ALLOWED              1
#define IP_REASSEMBLY                   0           // default is 1
#define IP_FRAG                         0           // default is 1
//#define IP_REASS_MAXAGE                 3
//#define IP_REASS_MAX_PBUFS              10
//#define IP_FRAG_USES_STATIC_BUF         1
//#define IP_FRAG_MAX_MTU                 1500
#define IP_DEFAULT_TTL                  255

//*****************************************************************************
//
// ---------- ICMP options ----------
//
//*****************************************************************************
//#define LWIP_ICMP                       1
#define ICMP_TTL                       (IP_DEFAULT_TTL)

//*****************************************************************************
//
// ---------- RAW options ----------
//
//*****************************************************************************
#define LWIP_RAW                        1
#define RAW_TTL                        (IP_DEFAULT_TTL)

//*****************************************************************************
//
// ---------- DHCP options ----------
//
//*****************************************************************************
#define LWIP_DHCP                       0           // default is 0
//#define DHCP_DOES_ARP_CHECK             ((LWIP_DHCP) && (LWIP_ARP))

 

//*****************************************************************************
//
// ---------- AUTOIP options ----------
//
//*****************************************************************************
#define LWIP_AUTOIP                    1           // default is 0
#define LWIP_DHCP_AUTOIP_COOP           ((LWIP_DHCP) && (LWIP_AUTOIP))
                                                    // default is 0
#define LWIP_DHCP_AUTOIP_COOP_TRIES     5           // default is 9

//*****************************************************************************
//
// ---------- IGMP options ----------
//
//*****************************************************************************
//#define LWIP_IGMP                       0

//*****************************************************************************
//
// ---------- UDP options ----------
//
//*****************************************************************************
#define LWIP_UDP                        1
#define LWIP_UDPLITE                    0
#define UDP_TTL                         (IP_DEFAULT_TTL)

//*****************************************************************************
//
// ---------- TCP options ----------
//
//*****************************************************************************
#define LWIP_TCP                        1
#define TCP_TTL                         (IP_DEFAULT_TTL)
#define TCP_WND                         4096   // default is 2048
#define TCP_MAXRTX                      12
#define TCP_SYNMAXRTX                   6
#define TCP_QUEUE_OOSEQ                 1
#define TCP_MSS                         1460        // default is 128
//#define TCP_CALCULATE_EFF_SEND_MSS      1
#define TCP_SND_BUF                     (6 * TCP_MSS)
                                                    // default is 256, was 6 *
#define TCP_SND_QUEUELEN                (8 * (TCP_SND_BUF/TCP_MSS))
//#define TCP_SNDLOWAT                    (TCP_SND_BUF/2)
//#define TCP_LISTEN_BACKLOG              0
//#define TCP_DEFAULT_LISTEN_BACKLOG      0xff

//*****************************************************************************
//
// ---------- Pbuf options ----------
//
//*****************************************************************************
#define PBUF_LINK_HLEN                  16          // default is 14
#define PBUF_POOL_BUFSIZE               256
                                                    // default is LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_HLEN)
#define ETH_PAD_SIZE                    2           // default is 0

//*****************************************************************************
//
// ---------- Sequential layer options ----------
//
//*****************************************************************************
//#define LWIP_TCPIP_CORE_LOCKING         0
#define LWIP_NETCONN                    0           // default is 1

//*****************************************************************************
//
// ---------- Socket Options ----------
//
//*****************************************************************************
#define LWIP_SOCKET                     0           // default is 1
#define LWIP_COMPAT_SOCKETS             0
//#define LWIP_POSIX_SOCKETS_IO_NAMES     1
//#define LWIP_TCP_KEEPALIVE              0
//#define LWIP_SO_RCVTIMEO                0
//#define LWIP_SO_RCVBUF                  0
//#define SO_REUSE                        0

//*****************************************************************************
//
// ---------- Debugging options ----------
//
//*****************************************************************************
#if 0
#define U8_F "c"
#define S8_F "c"
#define X8_F "x"
#define U16_F "u"
#define S16_F "d"
#define X16_F "x"
#define U32_F "u"
#define S32_F "d"
#define X32_F "x"
extern void UARTprintf(const char *pcString, ...);
#define LWIP_PLATFORM_DIAG(x) {UARTprintf x;}
#define LWIP_DEBUG
#endif

#endif /* __LWIPOPTS_H__ */

 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(中级)

6
 

回复 4楼 fengzhang2002 的帖子

我发送一个4K字节数组时,在SOCKET工具中接收的数据正好是4K字节,发送好像没有限制的样子。
接收时,不管通过SOCKET工具给终端发多少字节,只要是大于200个的总是在200个字节的地方出现问题。

您能不能再详细点拨一下,需要在那几个文件上下功夫?
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(中级)

7
 

终于知道200是从哪里来的了,如图示:

SocketData4.JPG (4.72 KB, 下载次数: 15)

SocketData4.JPG
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(中级)

8
 

Mr. FengZhang,

 

根据您的建议,我用这样的语句:       

        for(p=p; p!=NULL; p=p->next)
        {
            memcpy(&data[bufLen], p->payload, p->len);
            bufLen += p->len;
        }

连续发送:

0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

 

可以跨越200个数组大关,请您看看这种处理方法怎么样?是否可行?

您还有什么更优的方法?

 

Keil调试结果下如图:

SocketData5.JPG (24.18 KB, 下载次数: 0)

SocketData5.JPG
 
 
 

回复

918

帖子

0

TA的资源

纯净的硅(中级)

9
 

回复 8楼 h0nly_zhang 的帖子

这么说是接收缓冲区设置的不够大引起的?
 
 
 

回复

2641

帖子

0

TA的资源

五彩晶圆(中级)

10
 

回复 8楼 h0nly_zhang 的帖子

可以的,不是缓冲区不够,而是内存小了为了节约内存才这样做的
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(中级)

11
 

回复 9楼 academic 的帖子

跟缓冲器没有关系,就跟Mr.FengZhang说的:LWIP接收把数据分成一段一段的,每段根据TCP UDP的不同在200多个字节不定。

 

我接受1112个字符:分6包接受,单步执行上述过程如图所示:[localimg=298,139]5[/localimg]

Step1.jpg (12.43 KB, 下载次数: 0)

Step1.jpg

Step2.jpg (12.4 KB, 下载次数: 0)

Step2.jpg

Step3.jpg (11.89 KB, 下载次数: 0)

Step3.jpg

Step4.jpg (12.29 KB, 下载次数: 0)

Step4.jpg

Step5.jpg (12.29 KB, 下载次数: 0)

Step5.jpg

Step6.jpg (11.85 KB, 下载次数: 0)

Step6.jpg
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(中级)

12
 

又有了新的问题:

 

我通过Socket工具连续向8962发送1112字节数组,发送一次的过程:

1.8962发起连接网络;

2.Socket发送1112字节数据;

3.8962接收数据,并将其回发给Socket工具;

4.断开网络连接。

 

现象:

前三次收发正确,在第4次建立连接之后,向8962发送数据(数据大小都一样),没有进入到网络接收程序中,但是,此时单片机还在工作,也可以再次建立TCP连接。

 

疑问:

我的pbuf在每次进行完数据接收任务之后都已经释放,请问是什么原因导致接收不到数据?

[ 本帖最后由 h0nly_zhang 于 2011-3-8 17:12 编辑 ]
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(中级)

13
 

将lwipopts.h中的TCP_MSS修改为128之后,同样数据的重发次数有所提高。

//#define TCP_MSS                         1460        // default is 128  可连接4次
//#define TCP_MSS                         128        // default is 128  实验证明可连接13次

 

出现这种情况是不是接收内存耗尽了导致不能接收? 怎么回事啊?

TCP.JPG (43.76 KB, 下载次数: 0)

TCP.JPG

疯狂的连接.JPG (83.55 KB, 下载次数: 0)

疯狂的连接.JPG
 
 
 

回复

2641

帖子

0

TA的资源

五彩晶圆(中级)

14
 

回复 13楼 h0nly_zhang 的帖子

发送数据每帧不要超过1000字节,纯属个人经验,LWIP不是一个稳定成熟的产品,有很多BUG,只能自己去适应了
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(中级)

15
 

 结贴!

 

       在回调函数中定义一个pbuf的结构,在使用pbuf *p时,将其传给p_r指针,程序中对p_r进行操作,而不是对p进行操作。

        struct pbuf *p_r;

        //

        for(p_r=p; p_r!=NULL; p_r=p_r->next)
        {
            memcpy(&gucFModelStr[bufLen], p_r->payload, p_r->len);

            bufLen += p_r->len;

        }

这样修改之后,就不会出现数据接收几次就不能再进入接收中断的情况了。

 

具体原因还是不清楚,但总是感觉p指针及p->next指针占用的内存没有释放。在这里留个记号,等以后有时间再深入研究,也请高手们不吝赐教!

 

 问题解决了,多谢Mr.FengZhang 和 Mr.Academic的鼎力相助!致敬!!!

 
 
 

回复

918

帖子

0

TA的资源

纯净的硅(中级)

16
 

回复 15楼 h0nly_zhang 的帖子

好,这个问题记下了,谢谢与我们分享,希望早日找到具体原因。
 
 
 

回复

18

帖子

0

TA的资源

一粒金砂(中级)

17
 

回复 15楼 h0nly_zhang 的帖子

你好,找到原因了吗?我感觉pbuf_free(p)没起作用一样。
 
 
 

回复

29

帖子

0

TA的资源

一粒金砂(中级)

18
 
#define MEM_SIZE                        (24 * 1024)  // default is 1600, was 16K

默认 1600  怎么会是16K呢???  (1600/1024) K   不是这样的吗??
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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