W5200 client동작시 데이터 수신관련 문의드립니다


#1

안녕하세요. 일단 w5200 tcp server로 동작하여 pc쪽에서 연결을하고 데이터를 보내면 잘 받아집니다.
문제는 w5200을 client로 놓고 데이터를 특정 ip대상으로 보낸후, 다시 그쪽에서 보낸 데이터를 받아야하는데
여기서 잘 받아지지가 않습니다…자꾸 엉뚱한 값이 나오는데 아래는 받는 부분 소스 입니다…
제가 뭘 놓치고 있는지 자꾸 0값만 돌아오네요…조언 좀 부탁 드리겠습니다…

void TCP_client_con_one()
{
uint8 cmd_uart[4]={0xf1,MSB,LSB,0xf2};
int chk;
chk = 1;
while(chk == 1)
{
socket(s,Sn_MR_TCP,port,mode); // open the SOCKET
switch(getSn_SR(s))
{

		case SOCK_INIT:                     // The SOCKET opened with TCP mode
			
			if(MSB!=B9){
			switch(LSB){ //LSB는 UART에서 수신된 명령어 입니다..
			                 case 0x01:connect(s, addr0, port);break;  //커넥션을 하구요..			 
                    			 default: break;
					 }
					 }
		
			wait_1ms(10);                			 

			if(getSn_SR(s)==SOCK_ESTABLISHED)  // connected
			{						 
				if (getSn_IR(s) & Sn_IR_CON) 			// Confirm if received the data
				{
				       send(s, cmd_uart, 4, 0);  //DATA SEND..잘 보내집니다..
					IINCHIP_WRITE(Sn_IR(s),Sn_IR_CON);	// clear Sn_IR_CON
					chk=0;
					wait_1ms(5);
                   
                            //이 부분이 문제 같은데 SERVER모드에서 데이터수신할때 쓰던 소스입니다..
			if( (len=getSn_RX_RSR(s)) > 0 )    // check the size of received data
			{
				if(len > MAX_BUF_SIZE) len = MAX_BUF_SIZE; //MAX_BUF_SIZE = 2048
				
                                    recv_len = recv(s, data_buf, len);	//수신함수 입니다..				        
				
				for(i=0;i<4;i++){
				 
				 P(data_buf[i]);         //받은 데이터를 UART로 뿌려주는 겁니다.
				 }
			
		     }

                }
			}											
			break;	
			
		default:
			break;

	} //switch

	if (chk != 0)
		close(s);          // close the SOCKET
   } //while

  }

#2

안녕하세요.
문의하신코드를 기능적으로 검토를 해보면 크게 문제가 없어 보입니다.

그러나, 일반적인 경우 네트워크라는게 예측한 시간이나 상황에 맞게 동작하는 경우는 극히 드문 일입니다.

우선 저의 분석으로 보면 시간적으로 문제가 없다면 충분히 잘 도는 코드로 보입니다. 하지만 앞서 말씀드린것 처럼,
예측하지 못한 경우는 보장할 수 없을 것같습니다.
socket()이나, connect()같은 경우는 일회성 기능을 수행하는 function이므로, 구지 전체 while loop 에서 구현할 필요가 없어 보입니다만, 오히려, getSn_SR()이나 getSn_RX_RSR() 같이 Monitor 목적 function 들은 while loop에서 구현하는 것이 좋습니다. 아래 코드는 제 나름대로 수정해보았습니다. 참조하세요.

void TCP_client_con_one()
{ 
	uint8 cmd_uart[4]={0xf1,MSB,LSB,0xf2};
  
  socket(s,Sn_MR_TCP,port,mode); // open the SOCKET
	while(1)
	{
		switch(getSn_SR(s))
		{ 
			case SOCK_INIT: // The SOCKET opened with TCP mode
				if(MSB!=B9)
				{
					switch(LSB)
					{ //LSB는 UART에서 수신된 명령어 입니다..
						case 0x01:connect(s, addr0, port);break; //커넥션을 하구요.. 
						default: break;
				  }
				}
				//wait_1ms(10); 
				break;
		  case SOCK_ESTABLISHED:
				if (getSn_IR(s) & Sn_IR_CON) // Confirm if received the data
				{
					IINCHIP_WRITE(Sn_IR(s),Sn_IR_CON); // clear Sn_IR_CON
				}
				send(s, cmd_uart, 4, 0); //DATA SEND..잘 보내집니다.
				while(1)
				{
					//이 부분이 문제 같은데 SERVER모드에서 데이터수신할때 쓰던 소스입니다..
					if( (len=getSn_RX_RSR(s)) > 0 ) // check the size of received data
					{
						if(len > MAX_BUF_SIZE) len = MAX_BUF_SIZE; //MAX_BUF_SIZE = 2048
						recv_len = recv(s, data_buf, len); //수신함수 입니다.. 
						for(i=0;i<4;i++)
						{
							P(data_buf[i]); //받은 데이터를 UART로 뿌려주는 겁니다.
						}
						break;
					}
					disconnect(s);
				}
				break;
		  case SOCK_CLOSE_WAIT:
		  case SOCK_CLOSED:
		  	close(s);
		  	break;
			default:
				break;
  	} //switch
  } //while
}