野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9815|回复: 4

W5500接收数据长度 程序疑问

[复制链接]
发表于 2016-1-2 21:13:15 | 显示全部楼层 |阅读模式
本帖最后由 kepma 于 2016-1-2 21:16 编辑

已知:Sn_RX_RSR (Socket n 空闲接收缓存寄存器) [R] [0x0026-0x0027] [0x0000]
          Sn_RX_RSR显示了Socket n接收缓存中已接收和保存的数据大小。
问题:1-为何获得已接收数据长度 要两次相等才推出while循环 如图1,2
           2-对于接收数据看过有两种方式,火哥是直接从Sn_RX_RSR获得len,然后直接读取。
           而有人是这样处理的,先从Sn_RX_RSR获得socketn接收缓存中已接收和保存的数据大小 rx_size,然后从Sn_RX_RD获得的物理地址offset 加上rx_size 与S_RX_SIZE(2048)比较,然后决定怎么接收数据, 如图3,4
           哪种方式都ok?哪种更合适?




图1

图1

图3

图3

图4

图4

图2

图2
回复

使用道具 举报

发表于 2016-1-3 21:15:19 | 显示全部楼层
带缓冲区判断,他的应该更严谨,至于为什么要比较就不清楚了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-4 22:57:01 | 显示全部楼层
flyleaf 发表于 2016-1-3 21:15
带缓冲区判断,他的应该更严谨,至于为什么要比较就不清楚了

怎么说?但他不明白他这么写对不
回复 支持 反对

使用道具 举报

发表于 2016-1-5 18:02:24 | 显示全部楼层
对于第一个问题,主要就是判断缓存区大小,读两次进行判断主要也是防止数据溢出。因为如果传输数据比空闲缓存大了,多出来的数据会覆盖之前传输的数据,这样就会导致两次长度不一样,也会有错误。所以如果数据数据比检查剩余空间大,需要将数据分片处理。
对于第2个问题,两种方式都是可以的,区别就是第一种方式是通过判断缓存长度与接收数据长度来处理数据,第二种方式是通过判断数据在寄存器中物理地址范围来处理数据。

回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-5 22:53:36 | 显示全部楼层
傻彪5213 发表于 2016-1-5 18:02
对于第一个问题,主要就是判断缓存区大小,读两次进行判断主要也是防止数据溢出。因为如果传输数据比空闲缓 ...

你好,问题1:假设现在的物理地址是0x03FF,然后我接收数据1.5KB, 如果我接收缓存RX_BUFFER只有2KB(对应物理地址0x0000 - 0x07FF), 而0x03FF是物理地址的中间位置,这样我的多出来的0.5KB数据会从哪个物理地址开始? 从0x0000?

问题2: 一种方式就是判断缓存中数据的大小,然后直接接收数据 如图1, 并不是你说的吧缓存长度和数据长度比较。
而第二种方式,就是当前寄存器中物理地址加上数据size 与 最大缓存空间做比较,如图3和4,图3和4是一个完整的函数截图
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 08:34 , Processed in 0.043756 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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