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에 의해 출력되는 부분을 했었다. 그 부분에서 약간의 업그레이드 해보려고 한다.
- 정해진 UART 버퍼 사이즈보다 큰 데이터가 들어왔을때 처리.
결과론적으로 이번주에는 실패했다. 실패한 결과를 한번 보자.
- TCP Server ==>> UART
- UART ==>> TCP Server
차주에 다시 진행해 보려고 한다. 아래에 코드를 보면서 왜 실패했는지 알아보겠다.
//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 버퍼 인덱스를 초기화 해버리는 바람에 씹히는 것으로 예측이 된다.
다음 시간에는 이부분의 버그를 수정해 보겠다.
'IT / Development > WIZnet & Network ' 카테고리의 다른 글
Introducing Arduino ( Arduino Uno with ethernet shield and rotation sensor ) (0) | 2015.02.04 |
---|---|
W5500-EVB를 이용한 Chat Client 구현해 보자 - 4 (0) | 2015.01.26 |
W5500-EVB를 이용한 Chat Client 구현해 보자 - 2 (0) | 2015.01.12 |
W5500-EVB를 이용한 Chat Client 구현해 보자 - 1 (0) | 2015.01.11 |
WizFi250 채널 별 주파수를 측정하는 법을 알아보자. (0) | 2014.08.28 |