W5100 tcp send 문제(쓰레기값)

w5100 chip사용중인데 recv는 잘 되는데 send시 쓰레기값이 날라옵니다.

초보자라 그런지 잘 이해가 가지 않습니다.

atmega128 mcu에 wiz812mj Ethernet 모듈을 사용하고 있습니다.

말씀하신 것만으로는 답변드리기에 상당히 어려움이 있습니다.

해당 코드 등을 올려주시면 더 쉽게 답변드릴 수 있습니다.

다만 증상으로만 보자면 보낼 버퍼를 설정하는 부분에 있어 데이터 포인터를 잘못 설정하는 등의 실수가 있으면

의도하지 않은 데이터가 보내지겠죠? send buffer 설정하는 부분을 살펴보시기 바랍니다.

//TCP-Server 처리
void ProcessTcpSever(void)
{
unsigned int len;
unsigned char data_buf[TX_RX_MAX_BUF_SIZE];
uint16 port = MY_LISTEN_PORT;

char send_data_buf[1024] = {0x00,};

switch (getSn_SR(SOCK_TCPS))
{
case SOCK_ESTABLISHED: // 데이터 수신
	//check Rx data
	if((len = getSn_RX_RSR(SOCK_TCPS)) > 0)    
	   {
	       if (len > TX_RX_MAX_BUF_SIZE) 
		   		len = TX_RX_MAX_BUF_SIZE; 
	       //데이터 수신
			len = recv(SOCK_TCPS, data_buf, len);   
			printf("recvData ....%s \r\n", data_buf);
			sprintf(send_data_buf, "%s", "111111111111111111111111111111111111111111111111111112");
			//수신데이터 처리-> 루프백
			send(SOCK_TCPS, &send_data_buf, strlen(send_data_buf));    
			//send(SOCK_TCPS, data_buf, len);    
	   }  	
	break;
	
case SOCK_CLOSE_WAIT:         
	//If the client request to close
	printf(">>> disconnet\r\n");
	disconnect(SOCK_TCPS);
	break;
	
case SOCK_CLOSED:
	//if a socket is closed
	//reinitialize the socket 
	InitSocketServer(SOCK_TCPS, port);
	break;
}

}
//-----------------------------------------------------------------------------
서버 부분입니다.

윈도우 프로그래밍만 해봐서 그런지 맨첨에는 똑같이만 하면 되는줄 알았습니다.
그런데 recv는 잘 되는데 send를 하면 왜 쓰레기 값을 보내는건지 pc에서 잘못 받는건지 모르겠습니다.
마이컴에 아직 초보자라 참 힘이 드네요

pc에서 받은 데이터는 다음과 같은 데이터가 날라옵니다.(매번 바뀜)
췷2?w?D*셿뢐_?a?5쁤ge뗒V病0?툦縞쳜?籍LZ??妥?b?>佾h?뎤?& -B01붖

첨부파일로 소스파일 전체를 보내드립니다.

개발보드
mcu : 뉴티씨 KD-128PRO / Atmega128 개발보드
Ethernet : W5100 / WIZ812MJ

머리 잡아뜯다가 조만간 대머리 될듯…ㅠㅠ
w5100_evm_drv.zip (216 KB)

send(SOCK_TCPS, &send_data_buf, strlen(send_data_buf)); <---- 이 부분에서

send_data_buf는 array로 선언되어 있습니다.

따라서 “send_data_buf” 자체가 send_data_buf[0]의 시작 주소를 가르키게 됩니다.

하지만 &send_data_buf는 send_data_buf[0]의 시작 주소의 주소 입니다. -_-;;;;;

암튼 &가 없어져야 합니다.

수고하세요.

  1. send(SOCK_TCPS, &send_data_buf, strlen(send_data_buf));
  2. //send(SOCK_TCPS, data_buf, len);

이 코드에서 1번은 이것저것 다 해봤을때 “&” ← 이것도 넣어보고 2번처럼 기본코드를 넣고 해봐도 결과는 같았습니다.

참 뭐가 문제인지 저도 잘 모르겠습니다.

아직 마이컴에 대한 지식이 많이 없어서 그런거 봅니다 ㅠㅠ

안녕하세요.

보여주신 코드를 보았을 때 이상하다고 생각되는 점은 다른 연구원분께세 답변주신 부분 뿐입니다.

iolibrary Driver 코드를 참조하시면서 아래의 코드를 보았을 때

send(SOCK_TCPS, &send_data_buf, strlen(send_data_buf));
//send(SOCK_TCPS, data_buf, len);

send ( TCP , buffer , len ) 으로 되어야 하는데, 버퍼의 위치값의 충돌이 보여집니다.

포인터를 없애고 단순하게 배열로 구성해보세요. 그게 아마 더 쉬우실겁니다.

Edward

위에 제가 다시 올른글에 보면

  1. send(SOCK_TCPS, &send_data_buf, strlen(send_data_buf));
  2. //send(SOCK_TCPS, data_buf, len);

1번은 이것저것 해보다가 &를 넣어서 한것이었구요… 결과는 마찬가지
2번은 원래 기존 코드인데 이것이 먼저 쓰레기값나와서 1번이외 다른 방법으로도 여러번 시도해봤습니다.

send(SOCK_TCPS, "11111", 6); <- 이런식으로도 해봤습니다.

가뭄에 콩나듯 제값이 오기는 합니다.

결과값--------------------------------------------

[ 1460 ], ]`|퍡녯큵神?>눛O괽thfD績콷례e?윧gk?
???턘
B?BY謳?*M롉Y€쓁쁫?;Th써k#F6?p矢4 穉FW5?몰뾫@a|룓@f햞눖\納?&??∋湧@

[ 1460 ], )?R?괈??羔0?2?H汁???탒 홿nヰ_6?LRGr#?!갭VS??9뎘??<?댊찑? ⑧??w?N?"匯좝A%\娜€h~
?aX\

[ 1460 ], 꿻_?€:??CH씼L_%띉?5?쟦f*

----------------------------------------------결과값 끝

결과값에서 앞에 1460은 받은 크기 입니다.

그러나 이런 값으로는 마이컴의 원하는값을 얻기 위해서는 pc에서 수번의 send를 해야 얻을수 있을거 같습니다.
이렇게되면 패킷의낭비가 될수 있고 즉시 결과를 얻기도 힘들거 같다는 생각입니다.

코드가 문제인건지 아니면 마이컴과 w5100(WIZ812MJ)과의 연결이 잘못된 것인지 잘 모르겠습니다.

다음은 마이컴과 W5100을 연결한것입니다.(SPI통신)

마이컴    <--->    W5100
SS(PB0)    ---     SCS
SCK(PB1)   ---	   SCLK
MOSI(PB3)  ---	   MOSI	
MISO(PB4)  ---	   MISO

전원은 3.3V, GND를 J1, J2에 둘다 연결해 둔 상태입니다.

그리고 이건 다른질문인데

전원을 연결하는 부분이 J1,J2에 두군데가 있는데 SPI통신시에는 한군데만 연결해도 되는것인지요?
한군데만 연결하면 가끔 마이컴에 소스코드 업로드시 아이피가 잘 안먹는경우도 생기는거 같더군요

그리고 유선지원은 못받는 건가요?
바쁘신줄은 알지만 부탁드립니다.

쓰레기값 문제 해결했습니다.

문서를 잘 꼼꼼히 읽어봤어야 하는데 워낙 마이컴을 3 6 9 로 독학하다보니 깊은 지식이 없어서 실수를 했나 봅니다.

컴파일러 버젼 문제였습니다.

ver 4.x 이상을 쓰고 있었는데 문서에서는 3.6.5? 인가 를 써서 개발됬다고 해서 부랴부랴 버젼을 다운그레이드 하여

컴파일후 실행하니 제가 원하던 귀한 데이터들이 들어오는 것이었습니다.

몇주를 고생하다 해결하니 기분 참 좋기는 한데 허허 좀 허무 하네요

다음에 또 궁금한점 이나 문제 발생시 다시 물어보겠습니다.

귀사의 무궁한 발전을 기원합니다.

정말 수고하셨습니다. ^^