초급 예제

누구나 쉽게 따라해볼 수 있는 쉬운 예제들입니다. 가볍게 도전~!

Serial 함수와 명령어 (2)

2015-07-27 17:26:47

개요

 

지난 Serial 함수의 명렁어에 대해 자세하게 알아봅시다. - 1편에서 Serial함수에 알아봤습니다. 2편에서도 이어서 한국형 아두이노 오렌지보드에서 사용할 수 있는 다양한 Serial함수에 대해 알아보고 어떻게 동작하는지 확인해 보겠습니다.

 

 

 

 

 

7. Serial.setTimeout()

 

사용방법

 - Serial.setTimeout(time)

 

변수

 - time : 설정할 밀리초 단위의 타임아웃 시간(long 타입)

 


설명

Serial.setTimeout() 함수는 Serial.readBytes(), Serial.readBytesUntil(), Serial.parseInt(), Serial.praseFloat 함수를 이용할 때 데이터 값 수신을 대기하는 최대 시간을 세팅하는 함수 입니다.

 

기본적으로 1초(1000 millisecond)가 설정되어 있으며, 변수로 입력하는 값의 단위는 밀리초 입니다.(1second = 1000millisecond)

 

 

 

 

 

8. Serial.flush()

 

사용방법

 - Serial.flush()


예제 소스 코드(비교)

소스 코드 결과 화면(flush() 미사용)

char *buf = "This message for checkint a time";

void setup() {
  Serial.begin(9600);
}

 

void loop() {
  unsigned long int atime;

  for(int i = 0; i < 10; i++) {
    atime = micros();
    Serial.println(buf);
    Serial.println(micros() - atime);
  }
  while(1) ;
}  

 


 

 

소스 코드 결과 화면(flush() 사용)

char *buf = "This message for checkint a time";


void setup() {
  Serial.begin(9600);
}

 

void loop() {
  unsigned long int atime;

  for(int i = 0; i < 10; i++) {
    atime = micros();
    Serial.println(buf);
    Serial.flush();
    Serial.println(micros() - atime);
  }
  while(1) ;
}

 

설명

Serial.flush() 함수는 현재 전송하고 있는 시리얼 데이터가 전송완료가 될 때까지 기다리는 함수 입니다.(참고로 아두이노 1.0버전 이전은 버퍼에 들어온 데이터를 삭제하는 함수입니다.)

 

위의 두 예제를 보시면, 위의 예제는 flush()함수를 사용하지 않은 예제, 밑의 예제는 flush()함수를 사용한 예제 입니다. 

 

atime = micros();

Serial.println(buf);

Serial.println(micros() - atime);

 

위의 코드 세줄은 Serial.println(buf);를 실행하는데 걸리는 시간을 확인하는 부분입니다. 위와 아래의 예제를 비교하면 Serial.flush()의 사용 유무의 따른 차이를 확인 할 수 있습니다.

 

* 참고 : 아두이노 배우기 카페 - 김성필 님의 글

 

 

 

 

 

9. Serial.find()

 

사용방법

 - Serial.find(target)

 

변수

 - target : 검색할 String값 문자

 

반환

  - 읽어온 데이터 값 중 타겟이 있으면 true, 없으면 false : boolean값 리턴


예제 소스 코드(비교)

 

소스 코드 결과 화면

void setup(){
  Serial.begin(9600);
}

long temp = 0;

void loop(){
  while(Serial.available()){
    if(Serial.find("f")){
        temp = Serial.parseInt();
    }else{
      temp = 0;
    }
    
    Serial.print("Temp Value = ");
    Serial.println(temp);
  }
}

설명

Serial.find()함수는 지정된 길이의 대상 문자열이 발견 될 때까지 직렬 버퍼로 부터 데이터를 확인하는 함수입니다.

 

해당 문자열이 발견이 되면 True값을 리턴, 설정한 타임아웃 시간 까지 해당 문자열을 발견하지 못할 경우 False값을 리턴 합니다.

 

위의 예제 코드는 "f" 값이 들어올 경우 뒤의 값을 int로 받아서 temp값에 저장, 이 외에 다른 값이 들어오면 temp값을 0으로 초기화 한 후 저장하여 저장된 temp값을 시리얼 모니터에 출력해 주는 예제 입니다. 

 

 

 

 

10. Serial.findUntil()

 

사용방법

 - Serial.findUntil(target, terminal)

 

변수

 - target : 검색할 String값 문자

 - terminal : 검색을 종료할 String값 문자

 

반환

  - 읽어온 데이터 값 중 타겟이 있으면 true, 없으면 false : boolean값 리턴


예제 소스 코드

 

소스 코드 결과 화면

void setup(){
  Serial.begin(9600);
}

long temp = 0;

void loop(){
  while(Serial.available()){
     Serial.println(Serial.findUntil("f", "T"));
  }
}

설명

Serial.findUntil()함수는 Serial.find()함수와 같이 target문자열을 검색하는 함수입니다. find함수와 다른점은 종료 문자열을 설정하여 종료문자열을 찾을 때까지만 데이터를 검색합니다.

 

해당 문자열이 발견이 되면 True값을 리턴, 종료문자열을 발견하거나, 설정한 타임아웃 시간 까지 해당 문자열을 발견하지 못할 경우 False값을 리턴 합니다.

 

위의 예제 코드는 입력 받은 문자열 중 'f'값이 있는지 확인하는 예제입니다. 종료 문자열을 'T'로 설정했습니다. 처음에 'asdqwe'만 입력했을 경우는 기본 설정된 타임아웃 시간까지 기다렸다가 결과 값 0이 나오지만, 'asdqweT'를 입력 했을 경우 타임아웃 시간까지 대기하지 않고 바로 결과 값 0이 나오는 것을 확인 할 수 있습니다.

 * 'f'가 들어 갈 경우 f 앞뒤로 나뉘어서 검색을 하게 되므로 결과 값이 1, 0 2개가 나오게 됩니다. 

 
 

 

 

 

11. Serial.peek()

 

사용방법

 - Serial.peek()

 

반환

  - 읽어온 데이터 값 중 첫 번째 값


예제 소스 코드(비교)

 

소스 코드 결과 화면(read() 사용)

void setup(){
  Serial.begin(9600);
}

long temp = 0;

void loop(){
  if(Serial.available()){
     Serial.println(Serial.read());
  }
}

소스 코드 결과 화면(peek() 사용)

void setup(){
  Serial.begin(9600);
}

long temp = 0;

void loop(){
  if(Serial.available()){
     Serial.println(Serial.peek());
  }
}


 

 

설명

Serial.peek()함수는 Serial.read()함수와 같이 데이터를 읽어오는 함수 입니다. read()와 차이점은 read()함수는 데이터를 읽어오면 읽은 데이터는 버퍼에서 삭제하는데 반해, peek()함수는 시리얼 버퍼에 그대로 데이터를 저장합니다.

 

위의 예제 코드는 Serial.read()와 Serial.peek()함수의 차이점을 보여주는 예제입니다. read()함수를 사용할 경우 데이터를 읽은 후 시리얼 버퍼에서 지우기 때문에 다음에 호출하면 그 다음 값이 나오는데, peek()함수를 사용하면 시리얼 버퍼에서 데이터를 지우지 않기 때문에 다시 peek()함수를 호출하더라도 제일 처음 값 'a'값이 계속 나오게 됩니다.(시리얼 모니터에 출력되는 값은 ASCII코드 값으로 'a' = 97입니다.)

 

 

 

 

 

12. serialEvent()


예제 소스 코드

 

소스 코드 결과 화면

void setup(){
  Serial.begin(9600);
}

void loop(){
}

void serialEvent(){
  char text = Serial.read();
  Serial.print("data : ");
  Serial.println(text);
}

 

설명

serialEvent() 함수는 따로 어떤 용도로 인해 호출하는 함수가 아니라 시리얼 통신을 통해서 데이터가 입력될 때 자동으로 호출되는 함수 입니다. 기본적으로 정의하지 않아도 상관없지만, 위의 예제코드와 같이 serialEvent()함수를 정의해주면 시리얼 통신을 통해서 데이터가 입력 될 때 serialEvent함수가 호출되는것을 확인 할 수 있습니다.

 

위의 예제 코드를 보시면 주된 동작을 실행하는 loop()함수 안에 다른 코드 없이 serialEvent()함수가 실행 되는것을 확인 할 수 있습니다. 

 

 

여기까지 한국형 아두이노 오렌지보드에서 사용가능한 Serial관련 함수들에 대해 자세하게 알아보고 어떻게 동작이 됬는지 확인했습니다. 단순히 Serial.read(), Serial.write() 함수만 쓰시는게 아니라 1편부터 이어지는 12개의 함수를 다양하게 사용해서 자신이 구현하고 싶은 동작을 깔끔하게 구현해보세요.

 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

Serial, 함수, 기타

김연주 2015-12-21 16:45:03

설명부분에 오타가 있네요. Serial.praseFloat

김용식 2017-02-11 14:31:15

좋은 자료 고맙습니다.

seial을 이용하여 [배열]로 이용 할 값을 입력 하는 방법 알고 싶습니다.

kocoafab 2019-01-08 10:27:40

@김연주
수정하였습니다!! 감사합니다.

@김용식
혹시 어떻게 사용하실지 정확하게 알려주시면 감사하겠습니다.

Error622 2019-10-27 02:38:04

혹시 서로 다른 5개의 구부림 센서의 값을 블루투스로 받아 다시 각 각 다른 5개의 서보모터로 값을 넣어 줄수 있는 방법이 있나요?

윤수경 2020-06-04 16:03:25

많이 배우고 갑니다.^^ Serial.flush()함수 유용하게 쓰일거 같아요.