?>

Hard Copy World

HCW

Tip and Tech

Home > Info >

Tip and Tech

프로토콜을 쉽게 적용하기 - SerialCmd 라이브러리

페이지 정보

작성자 하드카피 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일15-04-09 00:57 조회3,008회 댓글0건

본문

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

 

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

 


하드카피 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물

모든 전통이 한 때는 오해를 면치 못했다. 마찬가지로 모든 아이디어는 한 때는 비웃음을 면치 못했다. -홀브룩 잭슨 ::::: 느닷없이 떠오르는 생각이 가장 귀중한 것이며, 보관해야할 가치가 있는 것이다. -베이컨 ::::: 미리 숙고하면 힘든 일도 그저 실행에 옮기는 순간 쉬워진다. - 로버트 M. 피어식

댓글목록

등록된 댓글이 없습니다.