OpenEdv-开源电子网

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

W5500接收时的奇怪现象,似乎粘包,但又不太像

[复制链接]

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2014-12-11
在线时间
15 小时
发表于 2018-8-3 11:03:54 | 显示全部楼层 |阅读模式
1金钱
大家好,我现在做一个项目是W5500 + STM32F103,做TCP 服务器,目前通讯基本正常,但有个奇怪的现象,请帮我分析下,谢谢!
前提:
1、W5500做服务器,Socket的接收缓存为2K

2、客户端每20ms发送一包共64Byte的数据,经过测试客户端发送时并没有粘包的情形

3、W5500驱动为ioLibrary_Driver-3.1.3
现象:
1、W5500接收数据时,正常时候会一次刚好接收1包数据,但会时不时的突然接收大量的数据
2、经过分析采集的数据及对应的时间发现W5500接收时,开始是每隔20ms接收一包,和发送对应,但在收到第32包的时候突然会变成间隔200ms同时收到10包(有时会多1包或少1包),然后重复
3、加大Socket的接收缓存,现象依旧,但间隔次数会大于32
4、延迟发送周期,现象依旧.
5、分析了下,刚好是收到第2048个字节也就是缓存满了的时候出现这种情况,怀疑是驱动里读缓存指针出现了问题,但是看文档和程序又没发现什么错误,所以没想明白是怎么一回事

----
上述就是基本情况,麻烦帮我看看,谢谢。

最佳答案

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

这个问题应该是由于你设置了RTR寄存器的值,RTR的值,即是发送等待ACK时间,也是接收等待时间,看样子你是设置成了200ms。 相当于,客户端以小于RTR内设置的时间间隔的方式给你发送数据,而你作为服务器端得等到200ms以后才给客户端ACK(同时通知本地接收完一帧),导致的结果就是,对方大量的给你发送数据,而你只能每200ms才能产生一次接受帧完成标志,当你接收到这个标志你再去读取,这样就太慢了,导致发送端很快就填满整个 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2019-11-3
在线时间
6 小时
发表于 2018-8-3 11:03:55 | 显示全部楼层
本帖最后由 lyjbighead 于 2020-6-24 14:56 编辑

这个问题应该是由于你设置了RTR寄存器的值,RTR的值,即是发送等待ACK时间,也是接收等待时间,看样子你是设置成了200ms。

相当于,客户端以小于RTR内设置的时间间隔的方式给你发送数据,而你作为服务器端得等到200ms以后才给客户端ACK(同时通知本地接收完一帧),导致的结果就是,对方大量的给你发送数据,而你只能每200ms才能产生一次接受帧完成标志,当你接收到这个标志你再去读取,这样就太慢了,导致发送端很快就填满整个BUFFER而溢出。

W5500这个芯片存在一个很大的问题。
就是没有关闭接收的指令,也就是说只要你初始化芯片并建立连接以后,一旦上位机通过网口给W5500发送数据,W5500就无脑接收,无论你关闭中断,还是任何其他设置,都不行。
并且往缓存里存取数据的时候,不是回环的,存满就溢出然后就会卡死。非常的无语。

这个芯片不适合大数据量或者高速的数据传输,只适合非常慢速的短帧数据传输,慎用。

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2018-8-5 02:23:21 | 显示全部楼层
帮顶
回复

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
7956
金钱
7956
注册时间
2014-8-13
在线时间
1590 小时
发表于 2018-8-5 05:27:40 | 显示全部楼层
将接收缓存调整为64Byte试试,并尝试增大发送间隔
回复

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
7956
金钱
7956
注册时间
2014-8-13
在线时间
1590 小时
发表于 2018-8-5 05:28:35 | 显示全部楼层
1、把接收缓存调整为64Byte试试,并尝试增大发送延迟
回复

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
7956
金钱
7956
注册时间
2014-8-13
在线时间
1590 小时
发表于 2018-8-5 05:29:44 | 显示全部楼层
1、减小接收缓冲区至64Byte试试,并尝试增大发送延迟。
2、再看看DataSheet
回复

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2014-12-11
在线时间
15 小时
 楼主| 发表于 2018-8-5 16:26:41 | 显示全部楼层

谢谢原子!这个问题还在困扰我
回复

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2014-12-11
在线时间
15 小时
 楼主| 发表于 2018-8-15 14:20:31 | 显示全部楼层
mack13013 发表于 2018-8-5 05:29
1、减小接收缓冲区至64Byte试试,并尝试增大发送延迟。
2、再看看DataSheet

谢谢,我再看看手册
回复

使用道具 举报

28

主题

86

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2018-2-23
在线时间
37 小时
发表于 2018-10-11 09:41:07 | 显示全部楼层
如果有W5500问题没有解决,可以来找我们深圳炜世科技,提供专业的技术支持。
官网:www.wisioe.com
QQ:2429075983
邮箱gustin@wisioe.com
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2019-11-3
在线时间
6 小时
发表于 2020-6-24 14:38:26 | 显示全部楼层
如果想提高反应速度,可以将寄存器Sn_MR的第5位设置为1,可以缓解。
回复

使用道具 举报

17

主题

170

帖子

0

精华

高级会员

Rank: 4

积分
562
金钱
562
注册时间
2018-7-8
在线时间
118 小时
发表于 2020-10-22 22:30:10 | 显示全部楼层
lyjbighead 发表于 2018-8-3 11:03
这个问题应该是由于你设置了RTR寄存器的值,RTR的值,即是发送等待ACK时间,也是接收等待时间,看样子你是 ...

你好,请教一个问题,我使用单片机和一个设备进行网络通信,单片机是客户端,设备是服务端,单片机发送一条指令,设备会回复立刻参数,那个情况下,w5500的RTR ( 重试时间值寄存器 )和RCR ( 重试计数寄存器 )设置多少比较合适?需要开启无延时 ACK 选项吗??谢谢
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2022-2-26
在线时间
0 小时
发表于 2022-2-26 22:31:56 | 显示全部楼层
老铁,接收数据粘包的问题最后解决了吗
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-28 03:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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