---
title: "W5300을 사용한 lan통신 프로그램 소스 관련 질문입니다"
url: "https://maker.wiznet.io/forum/10151"
markdown_url: "https://maker.wiznet.io/forum/10151/md"
type: "Forum topic"
category: "Ethernet Chips"
author: "tgo1800"
created: "2014-04-18T00:18:47+09:00"
last_activity: "2017-05-04T08:32:35+09:00"
language: "ko"
views: 1418
replies: 3
source: "WIZnet Makers forum (https://maker.wiznet.io/forum/)"
---

# W5300을 사용한 lan통신 프로그램 소스 관련 질문입니다

## Question

Asked by tgo1800 on 2014-04-18 in Ethernet Chips.

w5300을 클라이언트로 PC를 서버로 사용하고 있습니다.

PC에서 labview로 제작한 서버 프로그램을 먼저 실행한 후 서버에 전원넣은경우에는

데이터 전송이 잘 되었습니다.

하지만 서버에 전원을 먼저 넣고, PC 서버 프로그램을 실행한 경우

서로 연결(connect)이 안되는 문제가 발생하였습니다.

1. 제공되는 예제 프로그램에는 반복적으로 서버에 접속을 시도하지 않는것인가요?

아니면 수정해야 하는 부분이 있는것인가요?

프로그램에 브레이크를 걸어가며 확인해 본바

아래 Connect 함수 중 while문에서 빠저나가지 못하여 아래와 같이 while문을 제거 하였습니다.

프로그램을 수정함으로서 1번 문제가 해결되는듯 보였으나

연결이 될 때도 있고, 한참뒤(약2분뒤)에 접속이 되는 것을 확인하였습니다.

uint8 connect(SOCKET s, uint8 * addr, uint16 port)
{
…
…

// Connect
ApplySubnet();
setSn_CR(s,Sn_CR_CONNECT);

// while( IINCHIP_READ(Sn_SSR(s)) != SOCK_SYNSENT )
// {
if(IINCHIP_READ(Sn_SSR(s)) == SOCK_ESTABLISHED)
{
// break;
}
//if(getSn_IR(s) & Sn_IR_TIMEOUT) // original
if((getSn_IR(s) & Sn_IR_TIMEOUT) || (getSn_IR(s) & Sn_IR_DISCON))//remaked
{
setSn_IR(s,(Sn_IR_TIMEOUT));
// break;
}
a=getSn_IR(s);
// }
ClearSubnet();
return 1;
}

설정시 timeout은 아래와 같이 설정하였습니다.
setRTR(1000); //time_out : 100ms
setRCR(10);

## Replies

### Reply 1 by tgo1800, 2014-04-27

전번에 제가 질문을 잘못드린것 같아 다시 질문드립니다.

w5300을 클라이언트로 PC를 서버로 사용하고 있습니다. MCU로는 DSP(TMS320C28346)를 사용하고 있습니다.

PC에서 서버 프로그램을 먼저 실행한 후 클라이언트(w5300)를 동작시키는 경우에는 데이터 전송이 잘 됩니다.

데이터 전송중에 PC 서버 프로그램을 종료 후 다시 동작시킨 경우

서로 연결(connect)이 안되는 문제가 발생하였습니다.

코딩한 프로그램에 브레이크를 걸어가며 확인해 보니

아래 Connect 함수 중 while문에서 빠져나가지 못하고 있었습니다.

uint8 connect(SOCKET s, uint8 * addr, uint16 port)
{
…
// Connect
ApplySubnet();
setSn_CR(s,Sn_CR_CONNECT);

while( IINCHIP_READ(Sn_SSR(s)) != SOCK_SYNSENT )
{
if(IINCHIP_READ(Sn_SSR(s)) == SOCK_ESTABLISHED)
{
break;
}
if(getSn_IR(s) & Sn_IR_TIMEOUT) // original
{
setSn_IR(s,(Sn_IR_TIMEOUT));
break;
}
ClearSubnet();
return 1;
}

1. 서버와 연결이 끊기면 설정된 Time_out시간이 지나면 break되어 while문을 빠져나오는 것이 아닌가요?

설정시 timeout은 아래와 같이 설정하였고, 약3분가량 기다렸으나 while문을 빠져나오지 않았습니다.
setRTR(14);
setRCR(8);

1. timeout관련 설정은 위의 두가지만 (setRTR(14); setRCR(8); ) 하였는데,

이 외에 timeout관련 레지스터를 설정해야 하나요?

1. getSn_SSR(s) 값이 0x10인 경우에는 w5300자체를 리셋해주어야 하나요?

### Reply 2 by tgo1800, 2014-04-28

위에 질문드린 3번에 관해 추가 질문드립니다.

Sn_SSR이 0x10에서 변하지 않는 내용에 관한문제가 "erratum1"인것으로 보이는데

이미 제공된 예제의 Close()함수에 이 내용이 들어가 있는 것을 보입니다.

if(loop_cnt++ > 10)
{
uint8 destip[4];
// M_11252008 : modify dest ip address
//getSIPR(destip);
destip[0] = 0;destip[1] = 0;destip[2] = 0;destip[3] = 1;
socket(s,Sn_MR_UDP,0x3000,0);
sendto(s,(uint8*)“x”,1,destip,0x3000); // send the dummy data to an unknown destination(0.0.0.1).
break; // M_11252008 : added break statement
}

그런데도 0x10을 계속 유지하는데,

원인 및 해결책이 따로 있을 까요?

### Reply 3 by tgo1800, 2014-04-28

패킷을 캡처하여 올립니다.

w5300의 ip는 192.168.0.230입니다.

서버를 먼저 동작시킨 후에 클라이언트(w5300)을 동작시켰습니다.

그 결과 데이터 전송이 잘 이뤄지는 것을 확인하였습니다.

그 후 서버를 off하였을 때 빨간색으로 재전송이 9번 시도되는 것으로 보여지는 것을 확인하였습니다.

하지만 그 이후로는 아무런 변화도 없었습니다.

서버를 다시 on 시킨뒤에도 마찬가지 였습니다.

프로그램에 브레이크를 걸어 다시 확인해 봤더니

위에서 질문드렸던 내용중에서 처럼 while문을 계속돌고 있었습니다.

이때의 Sn_SSR값은 0x10이고, Sn_IR값 역시 0x10이 었습니다.

제가 통신쪽은 초보라 많이 부족합니다.

검토 부탁드립니다.

---

Source: https://maker.wiznet.io/forum/10151
