打印

请教:W5100断包的问题

[复制链接]
1773|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
txw51|  楼主 | 2012-12-12 13:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
W5100, TI, os, ck, se
我用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;
}*/
}

相关帖子

沙发
2389676302| | 2012-12-12 15:41 | 只看该作者
这个问题还真是把我难倒了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

11

帖子

1

粉丝