我的问题是通过TCP数据传输丢失了数据。
我已经构建了一个基于AVR的自制网络服务器(或至少尝试过)。
我能够与客户端PC(我的PC)通信,并且我能够发送一些HTML行(总数据<100字节),没问题。
但是当我想发送我的基本主页(~1KB)时,我只获得了WireShark 181字节的数据。
我怀疑问题在于构建TCP。
以下数据采用十六进制格式
来自客户(我的电脑):
sequence number: de db c7 b1
ack number: 00 0a 00 0b
来自服务器(AVR):
sequence number: 00 0a 00 0b
ack number: de b6 c9 18
总TCP长度:935byte,IP和TCP头20-20字节
我设置了哪些设置错误?
答案 0 :(得分:1)
TCP是一个流,并不能保证每个发送只会产生一个recv。您需要重复调用send直到发送所有字节,并且在另一端您还需要重复recv,在每个后续成功的recv上将新数据附加到缓冲区的末尾...您不能忽略来自发送/接收电话,您必须使用它来了解发送/接收的数据量。
答案 1 :(得分:0)
解决了问题!
ENC28J60_CS();
ENC28J60_CMD(WCR,ETXNDL);
SPIWR(package_length);
SPIWR(16+(package_length>>8));
ENC28J60_DS();
package_length是一个整数,ETXNDL(寄存器)也是。 到目前为止,第二个SPIWR()函数只发送了值16:SPIWR(16); 所以问题是,我从未将package_length的高字节添加到16,所以芯片总是发送1-255字节长的包。
为什么16? RX缓冲区从0x0000开始,以0x0fff结束。 TX缓冲区从0x1000开始,到0x1fff结束。