我用W5100做网络通信,不知道为啥,老是断包,而且断包位置都是16的整数倍,如下是正确的接收到原始数据:
12:54:31 IP:192.168.0.173:3001 --接收新数据!
0 1 2 3 4 5 6 7 8 9 a b c d e f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd
如下是出现的断包情况:
12:55:30 IP:192.168.0.173:3001 --接收新数据!
0 1 2 3 4 5 6 7 8 9 a b c d e f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f
12:55:30 IP:192.168.0.173:3001 --接收新数据!
50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd
12:56:30 IP:192.168.0.173:3001 --接收新数据!
0 1 2 3 4 5 6 7 8 9 a b c d e f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f
12:56:30 IP:192.168.0.173:3001 --接收新数据!
50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd
如下是我的发送源码:
/*-----------------------------------------------------------------------------
如果要通过Socket发送数据,则引用该程序
要发送的数据缓存在Tx_buffer中, size则是要发送的字节长度
异常处理:当网络连接不畅或者数据无法发送时等待发送
-----------------------------------------------------------------------------*/
unsigned char SendDataToNet(SOCKET s, unsigned int size,unsigned char *Send_Buf)
{
unsigned short i,j;
uint8 err;
unsigned short tx_free_size,tx_offset;
char Debug10[40];
OS_ENTER_CRITICAL();
OSMutexPend(NetMutex, 0, &err);
//if((S0_State& S_CONN )== S_CONN)
{
//OSTimeDly(OS_TICKS_PER_SEC/20); //如果发送没有准备好 等待100mS
/*if(s==SOCKET0)
{
while((S0_State& S_TRANSMITOK )!= S_TRANSMITOK)
{
OSTimeDly(OS_TICKS_PER_SEC/20); //如果发送没有准备好 等待100mS
}
}
if(s==SOCKET1)
{
while((S1_State& S_TRANSMITOK )!= S_TRANSMITOK)
{
OSTimeDly(OS_TICKS_PER_SEC/10); //如果发送没有准备好 等待100mS
}
}*/
/*读取缓冲区剩余的长度*/
tx_free_size=Read_W5100(W5100_S0_TX_FSR+s*0x100);
tx_free_size*=256;
tx_free_size+=Read_W5100(W5100_S0_TX_FSR+s*0x100+1);
if(tx_free_size<size) /*如果剩余的字节长度小于发送字节长度,则返回*/
{
OSMutexPost(NetMutex);
OS_EXIT_CRITICAL();
return FALSE;
}
/*读取发送缓冲区的偏移量*/ /*重点调试此部分*/
tx_offset=Read_W5100(W5100_S0_TX_WR+s*0x100);
tx_offset*=256;
tx_offset+=Read_W5100(W5100_S0_TX_WR+s*0x100+1);
i=tx_offset/S_TX_SIZE; /*计算实际的物理偏移量,S0_TX_SIZE需要在前面#define中定义*/
sprintf(Debug10,"tx_offset:%d-----i:%d\r\n",tx_offset,i);
UartWrite(UART0,(uint8 *)Debug10,strlen(Debug10),NULL);
/*注意S0_TX_SIZE的值在W5100_Init()函数的W5100_TMSR中确定*/
tx_offset=tx_offset-i*S_TX_SIZE;
sprintf(Debug10,"new tx_offset:%d\r\n",tx_offset);
UartWrite(UART0,(uint8 *)Debug10,strlen(Debug10),NULL);
j=W5100_TX+s*S_TX_SIZE+tx_offset; /*实际物理地址为W5100_TX+tx_offset*/
for(i=0;i<size;i++)
{
if(tx_offset>=S_TX_SIZE)
{
j=W5100_TX+s*S_TX_SIZE;
tx_offset=0;
}
Write_W5100(j,*Send_Buf); /*将Tx_buffer缓冲区中的数据写入到发送缓冲区*/
j++;
tx_offset++;
Send_Buf++;
}
/*计算下一次的偏移量*/
tx_offset=Read_W5100(W5100_S0_TX_WR+s*0x100);
tx_offset*=256;
tx_offset+=Read_W5100(W5100_S0_TX_WR+s*0x100+1);
tx_offset+=size;
Write_W5100((W5100_S0_TX_WR+s*0x100),(tx_offset/256));
Write_W5100((W5100_S0_TX_WR+s*0x100+1),tx_offset);
Write_W5100((W5100_S0_CR+s*0x100), S_CR_SEND); /*设置SEND命令,启动发送*/
if(s == 0)Net_State_Show(0); //-网络接口 灰色
OSTimeDly(2); //加延时,避免连包
OSMutexPost(NetMutex);
OS_EXIT_CRITICAL();
if(s==SOCKET1) onLing = FALSE;
return TRUE; /*返回成功*/
}
/*else
{
return FALSE;
}*/
}
|