프로토콜을 쉽게 적용하기 – SERIALCMD 라이브러리
각종 통신 모듈을 serial 또는 SoftwareSerial 로 연결해서 쓰는 경우, 데이터를 보낼 때 자신만의 데이터 구조를 만들어서 보낼겁니다.
이런 프로토콜은 간단한 데이터를 보낼 때는 구현도 간단하지만, 복잡한 데이터를 보낼 때는 받는 쪽에서 처리하기도 복잡해집니다. 이런 경우 보다 쉽게 데이터를 parsing 해서 그 결과만 쉽게 참조해서 쓸 수 있도록 도와주는 라이브러리가 있어서 소개합니다.
SerialCmd 라이브러리 입니다.
데이터를 보낼 때 일정한 형식으로 보내도록 만들고, 수신측에서 SerialCmd 라이브러리를 사용해서 수신한 데이터를 처리하면 우리가 사용하기 좋게 값이 분류되어 나옵니다.
# 데이터를 송신할 때
- 아래와 같은 형태의 string 을 전송하면 됩니다.
- 명령( 발신처, 수신처갯수, 수신처, 데이터,..)
- 명령( 발신처, 0, 데이터,..) — 모두에게
(예)
<STX>LedOnOff( 0, 1, 1, true )<ETX> // 1번 아두이노 Led 켜기
<STX>LedOnOff( 0, 0, true )<ETX> // 모든 아두이노 Led 끄기
<STX>Sensor(0, 1, 2)<ETX> // 2번 아두이노 센서값 요청
# 데이터를 수신 할 때
아래와 같이 코드를 짜서 데이터를 읽을 수 있습니다.
Command( v0, v1, v2, v3, v4) 와 같이 데이터를 보냈다면 데이터를 읽을 때 SerialCmd.bParam[x] 와 같은 형태로 읽을 수 있습니다. 여기서 x는 0부터 시작하는 index 입니다. bParam이 의미하는 것은 true/false 값으로 가져온다는 의미입니다. iParam은 정수, fParam은 실수입니다. 각 데이터의 종류는 보내는 쪽과 미리 약속이 되어 있어야 합니다.
SerialCmd SerialCmd( true, SoftRx_Pin, SoftTx_Pin, 9600); // Rx,Tx 핀과 baud 설정
void setup() {
SerialCmd.setPacketMode( pm_STXETX ); // 혼신을 방지하기 위해 <STX>, <ETX> 사용
// SerialCmd.setPacketMode( pm_CRLF ); // CR,LF 가 같이 전송되어 때 사용
}
void loop() {
// Serial로 들어온 명령어 처리
if( SerialCmd.available() > 0) {
if ( Check_To_Me() ) { // 나에게 온 것이면 명령어 처리
if (SerialCmd.isCmd( "LedOnOff" )) {
// LED on off 커맨드에 대한 처리
// 데이터 파라메터의 첫번째 인덱스는 수신처갯수+2 이므로
// param 값은 SerialCmd.bParam[ SerialCmd.iParam[1] + 2 ]
digitalWrite( led_Pin, SerialCmd.bParam[ SerialCmd.iParam[1] + 2 ] );
}
}
}
// SoftwareSerial 로 들어온 명령어 처리
if ( SerialCmd.available_Soft() > 0 ) {
if ( Check_To_Me() ) { // 나에게 온 것이면 명령어 처리
if (SerialCmd.isCmd( "Motor" )) {
// Motor 커맨드에 대한 처리
}
if (SerialCmd.isCmd( "Sensor" )) {
// Sensor 값 요청에 대한 처리
float Sensor1 = 2.34;
float Sensor2 = 5.67;
SerialCmd.SoftSerial.print( "Report(" );
SerialCmd.SoftSerial.print( myID ); // 발신처
SerialCmd.SoftSerial.print( ',' );
SerialCmd.SoftSerial.print( SerialCmd.iParam[0] ); // 수신처 = 수신메시지의 발신처
SerialCmd.SoftSerial.print( ',' );
SerialCmd.SoftSerial.print( Sensor1 ); // 센서1 값
SerialCmd.SoftSerial.print( ',' );
SerialCmd.SoftSerial.print( Sensor2 ); // 센서2 값
SerialCmd.SoftSerial.println( ')' );
}
}
}
}
라이브러리 배포처, 참고자료
- 배포 : http://cafe.naver.com/arduinostory/29746
- 참고자료 : http://cafe.naver.com/arduinostory/16144
- http://cafe.naver.com/arduinostory/29746
.