안녕하세요. W7500P 사용해서 보드를 개발중에 있습니다.
(W5100, W5200, W5500등으로 제품을 개발 경험이 있습니다)
- PC – S/W HUB – W750SR 연결 구조에서 이상이 없던 코드가
- PC – W750SR 연결 구조에서 문제가 발생하여 테스트 중입니다.
먼저 UDP에 문제가 있는것 같아 아래의 Loopback 코드를 테스트 했습니다.
위의 1번 연결 구조에서는 문제가 없지만 2번 구조로 연결하면
전송후 응답 지연이 길게는 4초 까지 발생합니다.
@ 아래 코드에서 아래의 printf 부분을 삭제하면 지연이 발생하지 않습니다.
printf("size:%dBytes : ", ret);
for (int i = 0; i < ret; i++)
{
printf ("%02x ", buf[i]);
}
printf("\n");
@ printf 부분 대신 delay_ms(1) 같은 지연 함수를 사용해도 증상이 같습니다.
- 테스트 코드 입니다.
int32_t loopback_udps(uint8_t sn, uint8_t* buf, uint16_t port)
{
#define DATA_BUF_SIZE 1024
int32_t ret;
uint16_t size, sentsize;
uint8_t destip[4];
uint16_t destport;
switch(getSn_SR(sn))
{
case SOCK_UDP :
if((size = getSn_RX_RSR(sn)) > 0)
{
LED_BLUE_TOGGLE();
if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE;
ret = recvfrom(sn, buf, size, destip, (uint16_t*)&destport);
if(ret <= 0)
{
return ret;
}
printf("size:%dBytes : ", ret);
for (int i = 0; i < ret; i++)
{
printf ("%02x ", buf[i]);
}
printf("\n");
size = (uint16_t) ret;
sentsize = 0;
while(sentsize != size)
{
ret = sendto(sn, buf+sentsize, size-sentsize, destip, destport);
if(ret < 0)
{
return ret;
}
sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero.
}
}
break;
case SOCK_CLOSED:
if((ret = socket(sn, Sn_MR_UDP, port, 0x00)) != sn)
return ret;
break;
default :
break;
}
return 1;
}
위 이미지는 PC와 직접 연결했을때 패킷 캡춰한 것 입니다.
PC의 IP는 192.168.2.1이고, 보드 IP는 192.168.2.101 입니다.
테스트 프로그램은 Hercules를 사용했습니다.
Time 항목을 보시면 짧게는 100m에서 길게는 4초 정도 지연이 있습니다.
검토 부탁드리겠습니다.
테스트한 eclipse 소스파일 링크 남김니다. (업로드가 안되네요…)
감사합니다.