WIZnet Developer Forum

[W5100] send 명령시 여러번 전송이 됩니다.

안녕하세요. W5100 칩을 사용하고 있습니다.
이더넷을 통해 자바 프로그램으로 데이터를 전송하고 있습니다.
send 함수를 사용하였구요, 데이터 전송을 한번만 하도록 하여도
와이어샤크로 수신 데이터를 확인해보면 데이터를 여러번 수신하게 됩니다.
프로그램을 잘 못 작성한 것인지 어디서 문제가 되는지 잘 파악이 안되네요…

안녕하세요.
작업 환경이 어떠신지 알려주실 수 있으신가요?
W5100 칩 간의 통신하는 환경인가요? 아니면, W5100과 PC와 통신하는 환경인가요?
그리고 패킷은 어디에서 (송신단, 수신단) 캡쳐하셨는지 알려주시면, 감사하겠습니다.

W5100칩과 PC와의 통신 환경입니다.
패킷은 PC에서 캡쳐 하였습니다.

안녕하세요

PC(자바프로그램)으로 W5100이 데이터를 한번 전송하도록 하였는데,
데이터전송이 여러번 되고있다는 말씀이신가요?
W5100의 펌웨어를 어떤펌웨어를 사용하셨나요?

switch(getSn_SR(sn))
{
    case SOCK_ESTABLISHED :
        if(getSn_IR(sn) & Sn_IR_CON)
        {
            getSn_DIPR(sn, destip);
            destport = getSn_DPORT(sn);
            printf("%d:Connected - %d.%d.%d.%d : %d\r\n",sn, destip[0], destip[1], destip[2], destip[3], destport);
            setSn_IR(sn,Sn_IR_CON);
        }
        send(sn, buf, 10);
        break;

혹시 이러한 형태로 펌웨어를 작성하여서 send command가 한번 나가야된다고 판단하신거라면,

위에 code는 보통 상위단에서 반복문으로 잡혀있습니다.
따라서 socket이 establish 상태이면 무한으로 send command가 전송됩니다.
한번만 전송하고 싶으시다면 if문으로 flag를 사용하여서 send command를 전송하시거나,
connect 인터럽트가 떳을때 데이터를 전송하고, connect 인터럽트를 clear하면
connect 직후에만 데이터가 전송되므로 한번만 전송됩니다.

ex)

switch(getSn_SR(sn))
{
    case SOCK_ESTABLISHED :
        if(getSn_IR(sn) & Sn_IR_CON)
        {
            getSn_DIPR(sn, destip);
            destport = getSn_DPORT(sn);
            printf("%d:Connected - %d.%d.%d.%d : %d\r\n",sn, destip[0], destip[1], destip[2], destip[3], destport);
            setSn_IR(sn,Sn_IR_CON);
            send(sn,buf,10);
         }
         break;

ATmega128에서 PC의 Java로 1~10 까지의 숫자를 각 숫자간에 delay를 주어 1초 간격으로 전송을 한다하면, 1, 2, 3, 4, 5, 5, 5, 5, 5, 5, 6, 7, 8, 9, 10 …
이 처럼 5가 아주 짧은 순간(거의 동시)에 전송이 됩니다. 또는 3, 4, 5, 3, 4, 5 와 같이 일정 구간이 짧은 순간에 전송 됩니다.

안녕하세요

데이터 전송하는 부분의 코드와
와이어샤크로 캡쳐한 파일을 보내주시기바랍니다.
becky@wiznet.io

안녕하세요

보내주신 메일 확인하였습니다.
와이어샤크를 보면 send하는 data의 크기가 일반적인 상황에서는 10~11 byte인데
1KB 가 넘는 size의 data가 연속적으로 send 하는 부분을 문제라고 판단하시는거 같은데 맞나요?

펌웨어 문제로 보여집니다.
send()함수에서 send size 매개변수를 strlen(pstr) 로 하셨는데 debugging 해보시면 예상값이 아닐것으로 판단됩니다.
pstr과 strlen(pstr)을 debugging해보시면서 펌웨어 수정하시기 바랍니다.

strlen() 부분을 정수로 수정하고 전송을 해봤습니다.
전송할 데이터가 “11 24 \r\n” 이라고 하면 send(0, pstr, 8) 이나 send(0,pstr, strlen(pstr)) 모두 중간에 1KB가 넘는 데이터패킷이 캡쳐됩니다. (strlen(pstr)의 값이 8로 출력됩니다.)

안녕하세요

driver코드는 어떤코드를 사용중이신거죠?
git에서 다운 받으셨나요?

send함수의 반환값을 출력해보시기바랍니다.

send() 함수의 반환값을 출력해보면 전송데이터의 길이가 반환 되는 것 같습니다.
예제 코드를 다운로드 받을 곳이 있을까요?

send함수 내부에 보시면
wiz_send_data(sn, buf, len);
위의 코드가 있습니다.
실제 데이터가 전송되는 부분입니다.
len에 8이 전달되어야 하는데 중간에 변형이 있는거같습니다.
len값을 debugging해보시면서 찾으시면 될 것 같습니다.
다른 예제코드를 굳이 다운받으실 필요는 없을 것 같습니다.

len 값이 일정하게 출력이 되는데 같은 현상이 발생하는 것 같습니다.
혹시 네트워크 상의 문제로도 이런 증상이 발생할 가능성이 있을까요?

전혀없습니다.
send함수의 매개변수를 (uint16_t) 로 형변환 해준뒤에도 현상이 같으신가요?
send함수내부에서 첫 부분부터 len값이 예상하지 않은 값이 나오시나요?

uint16 send(
SOCKET s, /< the socket index */
const uint8 * buf, /
< a pointer to data */
uint16 len /**< the data size to be send */
)
위 함수의 uint16 len을 uint16_t,
send(0,pstr, (uint16)strlen(pstr)),
send(0,pstr, (uint16_t)strlen(pstr)) 각각 돌려봐도 현상이 같습니다.

send 함수 내부에서 len 값을 출력해봐도 정상 데이터 사이즈가 출력됩니다.

안녕하세요
send함수의 반환값은 예상값이 아니라고 이해하였었는데,
제가 제가 잘못이해하였나요?

send 명령시 여러번 전송이 되는 문제가 아니라 쓰레기값이 전송되는 문제일 수도 있겠다는 생각이 들어 다시 답글을 남깁니다.
이전에 얼추비슷한 내용의 글을 본적이 있는 듯 합니다.
avr studio 4.19로 코드를 작성 하고 있습니다. 혹시 avr studio 프로그램의 버전의 상이함으로 인해 문제가 생길 수도 있을까요?

4.19 버전의 avr studio를 4.18 버전으로 낮췄더니 문제가 해결되었습니다.

Copyright © 2017 WIZnet Co., Ltd. All Rights Reserved.