각종 통신 모듈을 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( ')' );
      }
    }
  }
}

라이브러리 배포처, 참고자료

.