연결직후 데이터 수신시

W5500을 서버로 만들고

main의 while(1) 에서

loopback_tcps로 데이터를 받고 있는데요

데이터를 보내는쪽에서 데이터를 보낼때

연결하자 마자 데이터를 보내고 있습니다

그랬더니 SOCKET -7 에러가 나는데요

디버깅을 해보니

loopback_tcps 안의

case SOCK_ESTABLISHED :
if(getSn_IR(sn) & Sn_IR_CON)
로 들어가서 바로 연결이 되고요

바로

if((size = getSn_RX_RSR(sn)) > 0)

여기로 들어가고 ret = recv(sn,buf,size);에서 데이터를 수신합니다

근데

recv 함수의

while(1)
{
recvsize = getSn_RX_RSR(sn);
tmp = getSn_SR(sn);
if (tmp != SOCK_ESTABLISHED) - 여기서 SOCK_ESTABLISHED) 상태가 아니라서 이구문으로 들어가고 -7 에러가 나네요

recv 함수 들어가기전에는

SOCK_ESTABLISHED 였는데 여기서는 왜 바뀌나요?

연결하자마자 너무 빨리 데이터를 보내서 그런걸까요?

아 그리고 혹시

지금은 loopback_tcps를 main 함수에서 계속 호출하면서

데이터가 들어왔는지 확인하잖아요

데이터가 들어왔을때 이벤트가 발생한다던지 그렇게 할수도 있나요?

항상 감사합니다^^

안녕하세요.
위즈네트입니다.

말씀하신 부분에서

case SOCK_ESTABLISHED :
if(getSn_IR(sn) & Sn_IR_CON)

이상태로 접속이 됐다는 말은 일단 ESTBLISHED 모드로 됐다는 상태입니다.

그런데 RECV 쪽에서

while(1)
{
recvsize = getSn_RX_RSR(sn);
tmp = getSn_SR(sn);
if (tmp != SOCK_ESTABLISHED)

이것이 에러가 발생한다는 건 저도 이해가 잘 안되는데요.

작성하신 코드를 다시 한번 확인해주셔야 할 것 같습니다.

일단 저희 코드에서는 ESTBLISHED상태로 접속한 상태에서 그 에러가 발생했다는 것은 Connection이 끊기고 다른 루틴으로 빠졌다는 것으로 밖에

설명이 안됩니다.

일단 말씀하신 연결하자맞 너무 빨리 데이터를 보내서 그런다는 문제는 아닌것 같습니다.

그리고 데이터가 들어왔을 때 이벤트를 발생하게 구현할 수 있습니다.

그걸 사용자분께서 코드로 작성하셔야 한다는 문제가 있지만요 ㅎㅎ…

저희 라이브러리를 그대로 사용하신 상태에서 나타난 문제인가요?

아니면 수정을 하시거나 직접 작성을 하신건가요??

다시 한번 확인부탁드립니다.

감사합니다 좀 더 고민해봐야겠습니다

근데 혹시 이벤트 발생하게 하는 예제 소스 같은게 있을까요?

저는 인터럽트에서 주기적으로 호출할까 했는데…

만약 콜백 함수 등록한다고 해도

그 등록한 콜백함수를 계속 호출해야 되니…결국은 폴링은 되는게 아닐까 싶기도 하고요

감사합니다^^

안녕하세요.

따로 이벤트 발생하게 구현한 소스는 보유하지 않고 있습니다.

보통 사용하시는 칩의 회사에서 예제 소스를 올려놓는데요.

사용하시는 벤더의 칩 홈페이지에 가셔서 예제 소스를 받으시는게

낫지 않나 하는 생각이 듭니다…ㅎㅎ;;

감사합니다.

항상 답변 감사합니다

이벤트 발생한다는게 인터럽트에서 주기적으로 호출한다는 의미…맞나요?

감사합니다.

안녕하세요.

보통 이벤트라는 것은 Clock과 관계된 말인데요.

Clock은 2가지의 상태인 Rising edge( 0 → 1로 Transition)와 falling edge(1 → 0으로 Transition) 가 있습니다.

여기서 보통 Clock이 Low(0)인 상태에서 1로 증가되면서(Rising edge) 동시에 칩 내부적으로 인터럽트가 0 → 1로 바뀌면서 인터럽트가 발생하는 것을

이벤트라고 칭합니다.

이렇게 된다면 Clock이 Rising edge임과 동시에 인터럽트가 발생한다면 모듈은 동작중이던 기능을 멈추고 인터럽트가 걸린 부분으로 넘어가겠죠?

그리고 말씀하신대로 이런 인터럽트가 주기적으로 계속 발생한다면 주기적으로 호출한다는 의미가 되겠죠?

감사합니다.