코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
2015-07-27 17:26:47
지난 Serial 함수의 명렁어에 대해 자세하게 알아봅시다. - 1편에서 Serial함수에 알아봤습니다. 2편에서도 이어서 한국형 아두이노 오렌지보드에서 사용할 수 있는 다양한 Serial함수에 대해 알아보고 어떻게 동작하는지 확인해 보겠습니다.
- Serial.setTimeout(time)
변수 - time : 설정할 밀리초 단위의 타임아웃 시간(long 타입)
|
Serial.setTimeout() 함수는 Serial.readBytes(), Serial.readBytesUntil(), Serial.parseInt(), Serial.praseFloat 함수를 이용할 때 데이터 값 수신을 대기하는 최대 시간을 세팅하는 함수 입니다.
기본적으로 1초(1000 millisecond)가 설정되어 있으며, 변수로 입력하는 값의 단위는 밀리초 입니다.(1second = 1000millisecond)
- Serial.flush()
소스 코드 | 결과 화면(flush() 미사용) |
char *buf = "This message for checkint a time"; void setup() {
void loop() { for(int i = 0; i < 10; i++) {
|
소스 코드 | 결과 화면(flush() 사용) |
char *buf = "This message for checkint a time";
void loop() { for(int i = 0; i < 10; i++) {
|
Serial.flush() 함수는 현재 전송하고 있는 시리얼 데이터가 전송완료가 될 때까지 기다리는 함수 입니다.(참고로 아두이노 1.0버전 이전은 버퍼에 들어온 데이터를 삭제하는 함수입니다.)
위의 두 예제를 보시면, 위의 예제는 flush()함수를 사용하지 않은 예제, 밑의 예제는 flush()함수를 사용한 예제 입니다.
atime = micros();
Serial.println(buf);
Serial.println(micros() - atime);
위의 코드 세줄은 Serial.println(buf);를 실행하는데 걸리는 시간을 확인하는 부분입니다. 위와 아래의 예제를 비교하면 Serial.flush()의 사용 유무의 따른 차이를 확인 할 수 있습니다.
* 참고 : 아두이노 배우기 카페 - 김성필 님의 글
- Serial.find(target)
변수 - target : 검색할 String값 문자
반환 - 읽어온 데이터 값 중 타겟이 있으면 true, 없으면 false : boolean값 리턴 |
소스 코드 | 결과 화면 |
void setup(){ long temp = 0; void loop(){ |
Serial.find()함수는 지정된 길이의 대상 문자열이 발견 될 때까지 직렬 버퍼로 부터 데이터를 확인하는 함수입니다.
해당 문자열이 발견이 되면 True값을 리턴, 설정한 타임아웃 시간 까지 해당 문자열을 발견하지 못할 경우 False값을 리턴 합니다.
위의 예제 코드는 "f" 값이 들어올 경우 뒤의 값을 int로 받아서 temp값에 저장, 이 외에 다른 값이 들어오면 temp값을 0으로 초기화 한 후 저장하여 저장된 temp값을 시리얼 모니터에 출력해 주는 예제 입니다.
- Serial.findUntil(target, terminal)
변수 - target : 검색할 String값 문자 - terminal : 검색을 종료할 String값 문자
반환 - 읽어온 데이터 값 중 타겟이 있으면 true, 없으면 false : boolean값 리턴 |
소스 코드 | 결과 화면 |
void setup(){ long temp = 0; void loop(){ |
Serial.findUntil()함수는 Serial.find()함수와 같이 target문자열을 검색하는 함수입니다. find함수와 다른점은 종료 문자열을 설정하여 종료문자열을 찾을 때까지만 데이터를 검색합니다.
해당 문자열이 발견이 되면 True값을 리턴, 종료문자열을 발견하거나, 설정한 타임아웃 시간 까지 해당 문자열을 발견하지 못할 경우 False값을 리턴 합니다.
위의 예제 코드는 입력 받은 문자열 중 'f'값이 있는지 확인하는 예제입니다. 종료 문자열을 'T'로 설정했습니다. 처음에 'asdqwe'만 입력했을 경우는 기본 설정된 타임아웃 시간까지 기다렸다가 결과 값 0이 나오지만, 'asdqweT'를 입력 했을 경우 타임아웃 시간까지 대기하지 않고 바로 결과 값 0이 나오는 것을 확인 할 수 있습니다.
* 'f'가 들어 갈 경우 f 앞뒤로 나뉘어서 검색을 하게 되므로 결과 값이 1, 0 2개가 나오게 됩니다.
- Serial.peek()
반환 - 읽어온 데이터 값 중 첫 번째 값 |
소스 코드 | 결과 화면(read() 사용) |
void setup(){ long temp = 0; void loop(){ |
소스 코드 | 결과 화면(peek() 사용) |
void setup(){ long temp = 0; void loop(){ |
Serial.peek()함수는 Serial.read()함수와 같이 데이터를 읽어오는 함수 입니다. read()와 차이점은 read()함수는 데이터를 읽어오면 읽은 데이터는 버퍼에서 삭제하는데 반해, peek()함수는 시리얼 버퍼에 그대로 데이터를 저장합니다.
위의 예제 코드는 Serial.read()와 Serial.peek()함수의 차이점을 보여주는 예제입니다. read()함수를 사용할 경우 데이터를 읽은 후 시리얼 버퍼에서 지우기 때문에 다음에 호출하면 그 다음 값이 나오는데, peek()함수를 사용하면 시리얼 버퍼에서 데이터를 지우지 않기 때문에 다시 peek()함수를 호출하더라도 제일 처음 값 'a'값이 계속 나오게 됩니다.(시리얼 모니터에 출력되는 값은 ASCII코드 값으로 'a' = 97입니다.)
소스 코드 | 결과 화면 |
void setup(){ void loop(){ void serialEvent(){ |
serialEvent() 함수는 따로 어떤 용도로 인해 호출하는 함수가 아니라 시리얼 통신을 통해서 데이터가 입력될 때 자동으로 호출되는 함수 입니다. 기본적으로 정의하지 않아도 상관없지만, 위의 예제코드와 같이 serialEvent()함수를 정의해주면 시리얼 통신을 통해서 데이터가 입력 될 때 serialEvent함수가 호출되는것을 확인 할 수 있습니다.
위의 예제 코드를 보시면 주된 동작을 실행하는 loop()함수 안에 다른 코드 없이 serialEvent()함수가 실행 되는것을 확인 할 수 있습니다.
여기까지 한국형 아두이노 오렌지보드에서 사용가능한 Serial관련 함수들에 대해 자세하게 알아보고 어떻게 동작이 됬는지 확인했습니다. 단순히 Serial.read(), Serial.write() 함수만 쓰시는게 아니라 1편부터 이어지는 12개의 함수를 다양하게 사용해서 자신이 구현하고 싶은 동작을 깔끔하게 구현해보세요.
kocoafabeditor
항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!