WIZnet Developer Forum

W5300에서 출력되는 Data의 갯수 지정 방법 문의

uint32 getSn_TX_WRSR(SOCKET s)
{
uint32 tx_write_size=0;
tx_write_size = IINCHIP_READ(Sn_TX_WRSR(s))& 0xffff;
tx_write_size = (tx_write_size << 16) + (IINCHIP_READ(Sn_TX_WRSR2(s))& 0xffff);
return tx_write_size;
}

void setSn_TX_WRSR(SOCKET s, uint32 size)
{
uint32 check;
IINCHIP_WRITE(Sn_TX_WRSR(s), (uint16)(size >> 16));
IINCHIP_WRITE(Sn_TX_WRSR2(s), (uint16)size);
check = getSn_TX_WRSR(s);
}

uint32 send(SOCKET s, uint8 * buf, uint32 len)
{
uint8 status=0;
uint32 ret=0;
uint32 freesize=0;
/* #ifdef DEF_IINCHIP_DBG
uint32 loopcnt = 0;

  PrintString("%d:send()\r\n",s);

#endif
*/
ret = len;
if (len > getIINCHIP_TxMAX(s)) ret = getIINCHIP_TxMAX(s); // check size not to exceed MAX size.

/*
* \note if you want to use non blocking function, “do{}while(freesize < ret)” code block
* can be replaced with the below code. \n
* \code
* while((freesize = getSn_TX_FSR(s))==0);
* ret = freesize;
* \endcode
/
// -----------------------
// NOTE : CODE BLOCK START
do
{
freesize = getSn_TX_FSR(s);
status = getSn_SSR(s);
/
#ifdef DEF_IINCHIP_DBG
PrintString("%d : fsize=%ld\r\n",s,freesize);
if(loopcnt++ > 0x0010000)
{
PrintString("%d : freesize=%ld,status=%04x\r\n",s,freesize,status);
PrintString("%d:Send Size=%08lx(%d)\r\n",s,ret,ret);
PrintString(“MR=%04x\r\n”,((vuint16)MR));
loopcnt = 0;
}
#endif
*/
if ((status != SOCK_ESTABLISHED) && (status != SOCK_CLOSE_WAIT)) return 0;
} while (freesize < ret);
// NOTE : CODE BLOCK END
// ---------------------

wiz_write_buf(s,buf,ret); // copy data

/*
#ifdef DEF_IINCHIP_DBG
loopcnt=0;
#endif
/
if(!check_sendok_flag[s]) // if first send, skip.
{
while (!(getSn_IR(s) & Sn_IR_SENDOK)) // wait previous SEND command completion.
{
/
#ifdef DEF_IINCHIP_DBG

     if(loopcnt++ > 0x010000)
     {

#ifdef _DEBUG_LANTEST
PrintString("%d:Sn_SSR(%04x)\r\n",s,status);
PrintString("%d:Send Size=%08lx(%d)\r\n",s,ret,ret);
PrintString(“MR=%04x\r\n”,((vuint16)MR));
#endif
loopcnt = 0;
}
#endif
/
if (getSn_SSR(s) == SOCK_CLOSED) // check timeout or abnormal closed.
{
/

#ifdef DEF_IINCHIP_DBG
PrintString("%d : Send Fail. SOCK_CLOSED.\r\n",s);
#endif */
return 0;
}
}
setSn_IR(s, Sn_IR_SENDOK); // clear Sn_IR_SENDOK
}
else check_sendok_flag[s] = 0;

// send
setSn_TX_WRSR(s,ret); //Data 갯수지정
setSn_CR(s,Sn_CR_SEND); //Data를 보내는 지령

return ret;
}

상기프로그램으로 Data 전송시 29개의 Data를 보내는데 보내고자하는 Data 29개 이후로 0x00이 많이 보내 집니다.
29이후로 몇개의 data가 더 보내지는지는 확인 중입니다.

setSn_TX_WRSR에서 보내는 Data 숫자는 확인하였습니다.

빠른 답변 부탁드립니다.

개인정보보호가 필요하지만 너무 급해서 전화 번호를 남깁니다. 010-2423-6357

안녕하세요 :slight_smile:

TCP 데이터 전송시 헤더 포함 60byte 이하의 데이터를 보낼시 뒤에 0을 채우는 패딩과정을 거쳐 패킷을 내보내게 됩니다.

확인부탁드립니다.

감사합니다.

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