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 인터럽트를 사용하고, CR과 LF에 의해 출력되는 부분을 했었다. 그 부분에서 약간의 업그레이드 해보려고 한다.

  1. 정해진 UART 버퍼 사이즈보다 큰 데이터가 들어왔을때 처리.

결과론적으로 이번주에는 실패했다. 실패한 결과를 한번 보자.

  • TCP Server ==>> UART
이 부분은 지난주에 작성했던 코드와 같기 때문에 정상적으로 오류 없이 동작하는 것을 확인했다.

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


차주에 다시 진행해 보려고 한다. 아래에 코드를 보면서 왜 실패했는지 알아보겠다.

//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로 전송하는 시점이 바뀌게 된다. 아래 코드를 보자.

// 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 ; }

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

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

다음 시간에는 이부분의 버그를 수정해 보겠다.

+ Recent posts