WIZnet技术专区
直播中

初学者陈

2年用户 3经验值
擅长:嵌入式技术
私信 关注
[技术问题讨论]

关于项目中遇到的W5500接收问题

咨询大家一个问题:用STM32或AT32 控制W5500 作为SERVER  PC端作出client, 现从PC端发送命令给W5500。 当整个系统只有单个W5500时 传输较为稳定。 当系统中有多个W5500时,PC发给各个W5500的指令 不能够被准时可靠的接收。 用抓包工具可以看到 retransmission ,DUP ACK等字眼。 即使本次命令在重传后被各个W5500接收, 在后续的系统工作中,总会有一个或多个W5500 与PC 掉线。附上W5500 收发部分代码。
  1. int Start_serve_net(void)
  2. {
  3.     int ret;
  4.     uint16_t size = 0, txsize = 0;

  5.     switch(getSn_SR(sn))
  6.     {
  7.         case SOCK_INIT :
  8.             printf("%d:Listen, TCP server loopback, port [%d]rn", sn, port);
  9.             if( (ret = listen(sn)) != SOCK_OK) return ret;
  10.             osThreadYield();
  11.             break;   
  12.         
  13.         case SOCK_LISTEN:

  14.             osThreadYield();
  15.             break;
  16.         
  17.         case SOCK_ESTABLISHED :
  18.             flag_cle = 0;
  19.             if(getSn_IR(sn) & Sn_IR_CON) setSn_IR(sn,Sn_IR_CON);
  20.          
  21.             if(!flag_req)
  22.             {
  23.                 printf("%d:SOCK_ESTABLISHEDrn", sn);            
  24.                 memset(pethbuf.buf,0,sizeof(pethbuf.buf));

  25.                 anchorRequestConfig(app.eui64,0);
  26.                 send(sn,(uint8_t*)&pethbuf.buf, sizeof(request_configCle_t)+6);                  
  27.                 flag_req = 1;               
  28.             }
  29.             if(flag_port3000 == 1)
  30.             {
  31.                                 at32_led_toggle(LED2);
  32.                                 flag_port3000 = 0;           
  33.             }            
  34.             if((size = getSn_RX_RSR(sn)) > 0) // Don't need to check SOCKERR_BUSY because it doesn't occur.
  35.             {
  36.                 printf("snrxsize = %dn", size);
  37.                 osMutexWait(app.ctrlServer[0].MutexId, 3);
  38.                 if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE;
  39.                 ret = recv(sn, Eth_Rx_Buffer, size);
  40.                
  41.                 if(Eth_Rx_Buffer[0] == RTLS_START_REQ && size == RTLS_START_REQ_LEN)
  42.                     Set_start_stop_RTLSreq();
  43.                 else if(Eth_Rx_Buffer[0] == RTLS_CMD_SET_CFG_CCP && size == RTLS_CMD_SET_CFG_CCP_LEN)
  44.                     Set_ccp_cmd();

  45.                 osMutexRelease(app.ctrlServer[0].MutexId);
  46.                 cnt_int = 0;
  47.             }
  48.             
  49.             osThreadYield();
  50.             break;
  51.             
  52.         case SOCK_CLOSE_WAIT :
  53.             if((ret = disconnect(sn)) != SOCK_OK) return ret;
  54.             printf("%d:Socket Closedrn", sn);
  55.         
  56.             osThreadYield();
  57.             break;

  58.         case SOCK_CLOSED:
  59.             
  60.             /* below is complete sequence to cancel any working mode */
  61.             vdsr_force_txrx_off();              //switch off DWxxxx
  62.             app_apptimer_stop();                //cancel application slow timer
  63.             ccp_timer_stop();                   //cancel fast CCP timer
  64.             vdsr_initreset_app(NULL, NULL, NULL, NULL);     //cancel all user call-backs

  65.             app.RtlsInfo.sendClkSync = 0;

  66.             if((ret = socket(sn, Sn_MR_TCP, 3000, 0x00)) != sn) return ret;
  67.             flag_req = 0;  txen = false;
  68.             printf("%d: SOCK_CLOSED open new Socketrn",sn);
  69.             osThreadYield();
  70.             break;
  71.         
  72.         default:
  73.             osThreadYield();
  74.             
  75.             break;
  76.     }
  77.     return ret;
  78. }

更多回帖

发帖
×
20
完善资料,
赚取积分