티스토리 뷰
앞의 글에서 구현했던 패킷 통신 프로젝트는 수신측에서 데이터를 수신 하든지 말든지 관계없이 송신측에서 일방적으로 데이터를 내보내는 구조를 가지고 있다. 즉, broadcast 방식인 셈이다.
이렇게 만든 통신 방식은 송신측에서는 단순하게 기능을 구현할 수 있는 장점이 있는 반면, 쓸데없는 자원을 낭비하는 것이라고 생각할 수 있다. 누군가가 데이터가 필요할 때 어떤 데이터가 필요한지 요청하고, 그 요청에 따른 결과를 되돌려주면 좀더 효율적인 통신이 이루어진다.
따라서, 이번 글에서 다룰 프로젝트는 Request/Reply 방식의 패킷 통신을 구현해 보는것이다.
컴퓨터 프로그램에서 특정 데이터를 요구하는 request message를 AVR로 보내면, AVR은 요청에 맞는 데이터를 reply 해 주는 것이다.
그럼, 먼저 컴퓨터 프로그램에서 Request 기능부터 만들어 보도록 하겠다.
그림에 보이는 것처럼 각각의 센서창에 'Get'이라는 버튼이 제공되는 것을 알수있다. 이 버튼을 누르면 AVR로 request message를 보내는 것이다.
Packet 클래스에 packetOut이라는 method를 추가하였다. 버튼에 해당되는 메시지 ID를 패킷으로 만들어 주는 기능을 수행한다.
메인 클래스에서 sendRequest method를 이용하여 실제 UART로 데이터를 내보도록 한다.
각각의 센서 화면창에 있는 버튼을 눌러서 패킷이 제대로 생성되는지 확인해 본다.
버튼을 눌렀을때 생성된 패킷 데이터를 디버거창에서 확인할 수 있다. Start/Stop flag를 비롯하여 message ID, CRC 값이 제대로 생성된것을 알 수 있다.
다음 단계로 AVR에서 이러한 요청 사항을 처리하는 기능을 구현해 보도록 하겠다.
7번 라인은 Start flag 데이터가 들어오는 것을 모니터링 하고 있는 것이다.
11번 라인은 Start flag가 들어온 상태에서 다시 flag가 들어온 상황에 해당되는 것이다. 그렇다는 얘기는 바로 앞에서 받은 flag는 Start가 아니라 사실은 Stop flag였던 것이다. 이번에 받은 것이 진짜 start flag인 것이다.
17~30번 라인은 Request 패킷을 계속 받아 들여서 data_buf에 하나씩 저장하는 기능을 수행한다. 이 과정은 Stop flag가 들어올 때까지 계속 반복된다. 혹시 들어오는 데이터가 Escape 문자인 경우 이 데이터는 버리고 다음에 오는 데이터에 0x20을 exclusive-or를 적용하여 원래 데이터로 복원해주어야 한다.
패킷이 모두 들어왔으면 CRC 계산을 하여 데이터에 오류가 없는지 검사한다.
CRC 검사까지 이상 없으면 Request message에서 Message ID를 추출하여 어떤 센서값을 원하는지 찾아서 해당 데이터를 Reply 해주면 된다.
이제, 보드에 적용하여 제대로 동작되는지 확인한다.
위의 그림은 Acceerometer 센서 값을 요구하여 AVR에서 reply 한 결과가 제대로 동작하였음을 보여주고 있다.
'심화' 카테고리의 다른 글
crt0 (0) | 2016.10.01 |
---|---|
Linker Script - 링커 스크립트 (3) | 2016.10.01 |
패킷 통신 - Message ID (0) | 2016.08.12 |
패킷 통신 - CRC (2) | 2016.08.11 |
패킷 통신 - Start/Stop flag (7) | 2016.08.10 |