2개의 AVR128 Board를 통신하기 위해서 RS232 Serial port를 사용하기로 결정을 했다
하지만 RS232를 이용하여 실시간으로 다른 Board를 Control 하고 Status를 읽어야 해야하기때문에 새로운 Protocol 을 만들기로 결정했다.
- 새로운 Protocol 의 적용 방안
- Protocol의 Flow Control 기능( TCP/IP와 참고 )
- Fast Response
- Connection Status 확인 ( CSMA/CD 와 유사하게 구현)
- Protocol의 안정성 ( CRC or Checksum)
- Simple Protocol
기본 개념은 많이 사용되어지는 Protocol과 비슷하게 구현하도록 했으며, 구조도 비슷하고 개념도 비슷하다.
다만 최대한 간략하게 만들었고, Network에 필요한 기능과 Checksum 기능을 추가했다.
간단히 개념을 소개하면 Host->Device로 GET, SET으로 Command 명령보내면, Device는 DATA를 Host에 전송해주거나 이 DATA를 Device에 설정하는 것이다.
그리고 더불어 Device->Host는 ACK or NAK인지 알아 Feedback을 받는 방식이다.
RPT Command는 Device->Host로 주기적으로 보내는 명령으로 Device의 상태를 주기적으로 알기위해서 만들었다.
그리고, 내부에 TYPE을 두어 원하는 각각의 별도의 명령을 만들었다.
위 것으로 보면, 사실 USB 이나, IETF 기반 HTTP/SIP/등 기본개념의 Protocol 인 것 같다.
두 CPU 간의 실시간 적용이다 보니, TCP/IP 처럼 Flow Control 개념이 필요 할 부분이 있는 것 간단히 이를 구현을 했다.
예를 들면, Host-> Device 가 GET를 이용하여 Data를 얻고자 했다면, Device->Host NAK or Checksum 에러로 인하여 얻지 못할 경우,
다른 Command를 바로 실행하는 것이 아니라 이를 반복하여 DATA 값을 얻는 것이다.
1.1 기본 Protocol Message 개념
기본 동작개념은 Master(Host) 와 Slave(Device) 개념을 가지고 Master가 Slave에게 SET or GET 명령을 주어 제어를 하고
Slave는 Master에게 ACK or NACK 주어 확인받는 방식이다.
사용하다보니, NACK의 사용이 거의 불필요 해지는 것 같다는 생각이 들어 이부분은 좀 더 생각을 해야 했다.
더불어 Protocol Parsing 하는 부분에서 내부 Buffer(FIFO형식) 를 두어 Flow Control을 하는 부분을 추가하였다.
매번 TYPE-0의 Message를 Count하고 이를 추적하여 ACK를 받았는지 확인하고 못받았다면, 자동으로 재 발송하는 System이다.
- Master Board의 동작방식
- MSG_DAT_TYP_SND_SET : TYPE-0의 방식으로 동작 제어 및 관련 설정 명령
- MSG_DAT_TYP_SND_GET : TYPE-0의 방식으로 동작 정보 읽기 및 상태정보 명령
- Slave Board의 동작방식
- MSG_DAT_TYP_ACK: TYPE-0의 두개 명령을 받으면 ACK를 주는 방식
- MSG_DAT_TYP_RPT_SET : TYPE-1의 방식으로 Master에 보고하는 방식
- TYPE-0 과 TYPE-1의 차이
1.2 Protocol Message 방식
MAIN : Master
SUB : Slave
- MAIN과 SUB의 Message의 기본설명 .
MAIN,SUB TX,RX TYPE-0 MSG_DAT_TYP_SND_SET OR MSG_DAT_TYP_SND_GET RX,TX TYPE-0 MSG_DAT_TYP_ACK MSG_DAT_TYP_NACK TYPE-1 MSG_DAT_TYP_RPT_SET There are two kind of Messages , TYPE-0, TYPE-1 Main can send two kinds of message GET or SET (TYPE0) to sub , this messages have flow control system. it's similar to window but simple so Sub have to resposne ack messages that sometimes includes datas to main. Sub can send messages to main but this don't have flow control, only report. (TYPE1)
요즘 주석을 영어로 쓰려고 하는 노력을 하고 있어서 그러니, 틀려도 이해를 해주시기 바람
- Message Types 구현 방법
- For Default Message (TYPE-0) ****** TYPE-0 (General Type, M->S or S->M) ------------------------------------------------------------ 0 1 2 3 4 [ 5 6 7 ]->LENs Except SEQ, ID0 ID1 TYP LENs SEQ [ CMD DAT0 DAT1 ]->LENs CMD and DATAs. ----------------------------------------------------------- 0xEA 0x57 0x10-SET 0x03 0x01 (M->S) odd number. --> checksum 0x11-GET --> checksum 0x20-ACK 0x02 (S->M) even number IDs : Preamble 0xEA 0x57 TYP : Type-0 (M->S) MSG_DAT_TYP_SND_SET OR MSG_DAT_TYP_SND_GET ** two commands have to receive ACK with data or without it. (S->M) MSG_DAT_TYP_ACK SEQ : Sequence Number between Main and Sub. LENs : Lens between CMD and DATs CMD : MSG_CMD_T is below ****** - For Report Message (TYPE-1) This Message is Only for Reporting Main so Do not need SEQ. ****** TYPE-1 (For Report Type, S->M ) ------------------------------------------------------------- 0 1 2 3 [ 4 5 6 ]->LENs ID0 ID1 TYP LENs [ CMD DAT0 DAT1 ] ------------------------------------------------------------- 0xEA 0x57 0x31-RPT 0x03 IDs : Preamble 0xEA 0x57 TYP : Type SEQ : Sequence Number between Main and Sub. LENs : Lens between CMD and DATs CMD : MSG_CMD_T is below ****
1.3 결론
현재 이 버전은 안정적으로 잘돌아가고 있으지만 사실 파싱하는 부분은 개선을 해나가야 할 것 같다.
실시간으로 빠른 모터제어와 다른 기능들을 제어를 하고 있어 괜찮게 구현을 한 것 같지만, AT Command 방식이 쉽고, 구현하기 더 좋은 것 같다.