위즈네트 아카데미

TUTORIAL

튜토리얼

Home  > 튜토리얼

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

WIZnet Academy 2015.04.09 12:50 조회 수 : 6

지난 포스팅 [W5500-EVB 활용 Chat Client 구현하기 - 3]에서는 UART 데이터가 유실되는 문제점을 발견 그 원인을 추측해 보았습니다. 이번 포스팅에서는 어떻게 문제를 해결하였는지 설명해 보겠습니다.

아래와 그림과 같이 일단 문제는 해결이 되어 정상 동작하는 것을 확인하였습니다.

TCP===>> UART : 정상동작

chat_Client-4-1

UART ===>> TCP : 코드를 수정 후 아래와 같이 정상적으로 동작하는 것을 볼수 있습니다. UART 버퍼 사이즈는 5byte 이고 전송한 데이터는 '1234567890' 이다. 5byte 이상의 데이터가 수신되어도 모든 데이터를 TCP로 전송 성공합니다.

chat_Client-4-2
#define SR_RX_BUF_SIZE  5
#define TCP_TX_BUF_SIZE 5
uint8_t sr_rx_data_[SR_RX_BUF_SIZE]; //UART RX Buffer
uint16_t sr_rx_size = 0; //UART RX Buffer Size
uint8_t tcp_tx_data[TCP_TX_BUF_SIZE]; //TCP TX Buffer
uint16_t tcp_tx_size = 0; //TCP TX Buffer Size
<p></p>

위 코드를 보면 tcp_tx_data라는 배열을 새로 선언했습니다. 이전에는 UART 수신 버퍼를 그대로 TCP로 전송을 했지만, 이번에는 UART 수신 버퍼를 TCP 송신 버퍼에 저장을 하고 TCP 송신버퍼에 저장된 데이터를 TCP로 전송 하도록 하였습니다.
//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_data < SR_RX_BUF_SIZE-1) sr_rx_buf_status = 0;
else sr_rx_buf_status = 1;
sr_rx_size++;
}

UART 인터터럽트 부분은 수정사항이 없으며. UART 데이터를 TCP로 전송하는 부분을 수정 하였습니다.
// Serial => Ethernet
int SerialToEther(uint8_t sn)
{
if(sr_rx_buf_status == 0){
if(sr_rx_data[sr_rx_size-1]==CR ){
memcpy(tcp_tx_data, sr_rx_data, sr_rx_size);
tcp_tx_size = sr_rx_size;
sr_rx_size = 0;
send(sn, tcp_tx_data, tcp_tx_size);
tcp_tx_size = 0;
}
}
else if(sr_rx_buf_status == 1){
memcpy(tcp_tx_data, sr_rx_data, sr_rx_size);
tcp_tx_size = sr_rx_size;
sr_rx_size = 0;
send(sn, tcp_tx_data, tcp_tx_size);
tcp_tx_size = 0;

}
return 0 ;
}

우선 기본적은 것은 지난 포스팅의 내용과  거의 동일합니다. TCP로 전송하기 전에 UART수신 버퍼를 TCP 전송 버퍼에 저장을 하고, TCP 전송 버퍼를 TCP로 전송 하는 것을 볼수 있습니다. TCP로 데이터를 전송하는 중간에 UART 데이터가 수신되어도 UART 수신 버퍼가 사용되고 있지 않기 때문에 정상적으로 UART 데이터를 수신할수 있습니다.

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

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

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

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

출처 : OSHW Alchemist