2015/01/11 - [IT / Development/WIZnet] - W5500-EVB를 이용한 Chat Client 구현해 보자 - 1

2015/01/12 - [IT / Development/WIZnet] - W5500-EVB를 이용한 Chat Client 구현해 보자 - 2

2015/01/26 - [IT / Development/WIZnet] - W5500-EVB를 이용한 Chat Client 구현해 보자 - 3

2015/01/26 - [IT / Development/WIZnet] - W5500-EVB를 이용한 Chat Client 구현해 보자 - 4

2015/03/19 - [IT / Development/WIZnet] - W5500-EVB를 이용한 Chat Client 구현해 보자 - 5


지난번에는 UART 데이터가 씹히는 현상을 볼수 있었다. 이번 시간에는 그 부분을 해결해 보려고 한다.

우선 결과부터 확인해 보자.

  • TCP ==>> UART
지난번과 같이 코드를 수정하지 않았기 때문에 정상적으로 동작을 하는 것을 볼수 있다.

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

아래 코드를 보면서 설명해 보겠다.

#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

위 코드를 보면 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 데이터를 수신할수 있다.

+ Recent posts