위즈네트 아카데미

TUTORIAL

튜토리얼

Home  > 튜토리얼

W5500 W5500-EVB활용 Chat Client 구현하기 - 3

WIZnet Academy 2015.04.09 11:19 조회 수 : 10

[W5500-EVB활용 Chat Client 구현하기 - 2]에서 UART 인터럽트를 사용하고, CR과 LF에 의해 출력되는 부분을 진행했었습니다.  이번 포스팅에서는 관련하여 약간의 업그레이드를 시도, 정해진 UART 버퍼 사이즈보다 큰 데이터가 들어왔을때 처리하기 위한 작업을 진행하였지만 실패한 내용에 대해서 분석해 보겠습니다.

1. TCP Server ===>> UART : 정상동작

chat_Client-3-1

2. UART===>>TCP Server

이부분에 대한 수정을 진행했는데, 정상적으로 동작하지 않습니다. UART 버퍼 사이즈를 5byte로 설정을 하고 5byte 이상이 들어오면 TCP로 전송을 하고 다시 UART 데이터를 수신하도록 했지만, 5byte 이후에 들어왔던 UART 데이터 중 3byte가 손실되는 것을 확인 할 수 있습니다.(전송 값 : 1234567890) 증상으로 보아 TCP로 전송을 하면서 UART로 들어온 데이터가 손실되는 것으로 예측됩니다.

chat_Client-3-2

아래 코드를 보면 손실의 원인을 추측할 수 있습니다.
//UART interrupt function
void UART_IRQHandler(void)
{
sr_rx_data[sr_rx_size]=Chip_UART_ReadByte(LPC_USART);
putchar(sr_rx_data[sr_rx_size]);

if(sr_rx_size < SR_RX_BUF_SIZE-1) sr_rx_buf_status = 0;
else sr_rx_buf_status = 1;
sr_rx_size++;

}

즉,  UART 버퍼의 크기가 지정된 메모리 크기보다 작으면 sr_rx_buf_status = 0, 크거나 같으면 sr_rx_buf_status = 1 이 되는 것을 볼수 있다. sr_rx_buf_status의 값에 따라 TCP로 전송하는 시점이 바뀌게 됩니다.
<p>// Serial => Ethernet
int SerialToEther(uint8_t sn)
{
if(sr_rx_buf_status == 0){
if(sr_rx_data[sr_rx_size-1]==CR ){
send(sn, sr_rx_data, sr_rx_size);
sr_rx_size = 0;
}
}
else if(sr_rx_buf_status== 1){
send(sn, sr_rx_data, sr_rx_size);
sr_rx_size = 0;
}
return 0 ;
}
</p>

위 코드를 보면 sr_rx_buf_status 값에 따라 전송하는 시점이 바뀌는 것을 볼수 있습니다. sr_rx_buf_status=0 일때는 UART 버퍼의 크기가 지정된 메모리 크기보다 작기 때문에 CR값이 수신되야 TCP로 전송을 하고 UART 버퍼 인덱스를 초기화 합니다.

sr_rx_buf_status=1 일때는 UART 버퍼의 크기가 지정된 메모리 크기보다 크기 때문에 TCP로 바로 전송하고 UART 버퍼 인덱스를 초기화 합니다. 이때 3byte는 이미 UART로 수신이 되었는데 UART 버퍼 인덱스를 초기화 해버리는 바람에 데이터가 유실 된 것으로 추측 됩니다.

W5500-EVB 활용 Chat Client 구현하기 – 1

W5500-EVB 활용 Chat Client 구현하기 – 2

W5500-EVB 활용 Chat Client 구현하기 – 4

W5500-EVB 활용 Chat Client 구현하기 – 5

출처 : OSHW Alchemist