참고자료

아두이노, 오렌지보드 등의 오픈소스하드웨어를 사용하는데 필요한 것들을 알아봅니다.

클래스(Class)-Serial

2014-08-13 10:08:14

Serial 클래스

Serial 클래스는 Serial 통신을 위한 기능을 정의하고 있다. 

 

Serial (시리얼) 통신은 말그대로 Serial (직렬) 통신으로  1:1통신이 기본이며 여러 통신방법 중 하나이다. 직렬 통신이란 한번에 한 비트씩 통신하는 방법이다. 그럼 당연히 반대말인 병렬 통신은 여러 비트를 동시에 보내는 통신 방법이 된다.

 

스케치 (아두이노를 동작하게하는 프로그래밍 언어)를 하다보면, 아두이노 IDE에서 시리얼모니터라는 창을 띄어, 출력값을 확인하거나 값을 입력하는 등을 많이 하곤하는데 이때 아두이노 IDE와 아두이노간에는 Serial 통신을 하게된다. 


시리얼 통신은 수년전부터 USB에 밀려 여러 컴퓨터나 노트북에서 사라지는 추세이지만 RS-232는 그래도 아직까지 무시할 수 없는 시리얼 인터페이스 표준이다.
시리얼 통신을 다른말로 RS-232통신이라 하며 TXD, RXD, GND 이렇게 3개의 선이 통신을 하기 위해 꼭 필요하다.


위 사진이 시리얼포트. 지금은 USB에 밀려 점차 사라지는 추세이다.

아두이노에는 시리얼 통신을 하기 위한 Serial클래스가 존재하며 하나의 Serial객체가 존재한다. 이 클래스를 사용하여 시리얼 통신이 가능하고 연결은 USB나 TX, RX선의 연결을 통해 이루어진다. 우노의 경우에는 TX, RX선은 각각 디지털 1번 0번핀에 해당하며 시리얼 통신을 하는경우에는 이 디지털 0번 1번핀은 입출력핀으로 사용이 불가능 하다.

시리얼 통신(RS-232)이 물리적 계층에서의 통신 규약이라면 그 아래 기능에 따라

UART(Universal asynchronous receiver transmitter)
USART(Universal synchronous asynchronous receiver transmitter)

로 나누어 지는데 UART는 비동기방식 통신이고 USART는 동기+비동기방식 통신이라고 보면 된다. 

동기 비동기의 차이는 데이터를 송수신할때 데이터를 기준 동기클럭에 맞추어서 보낼것인지 아니면 클럭에 상관없이 서로간 정한 속도로 보낼 것인지에 따라 나뉜다.
대부분 통신은 비동기 통신이며 아두이노에서 사용하는 시리얼 통신 또한 비동기통신이다.
비동기 통신이기에 아두이노에서는 시리얼 통신을 할 때 통신속도를 설정해 주어야 하며 이 통신속도는 보율(boud rate)이라 한다.
 

 

주요함수

시리얼 클래스는 Stream클래스를 상속하여 정의되어 있으며
시리얼 통신의 많은 함수들이 Stream클래스에 정의되어 있는 함수를 재사용하는 함수들로 포함되어 있다.
 

NO 함수명 정보
1 Serial.begin(speed)
Serial.begin(speed,config)
시리얼 통신의 전송속도(boud)와 데이터 비트 수, 패리티, 정지비트와 같은 옵션을 설정한다.
2 Serial.available() 시리얼포트로부터 시리얼데이터의 바이트크기를 읽어 반환한다.
3 Serial.end() 시리얼 통신을 종료한다. RX핀과 TX핀의 입출력을 허락하고,
다시 사용하기 위해서는 Serial.begin()함수를 호출하면 된다.
4 Serial.flush() 시리얼포트안에 존재하는 데이터를 비운다
5 Serial.print(val)
Serial.print(val,format) 
시리얼 통신 데이터를 시리얼포트로 ASCII형식으로 출력한다.
format은 BIN(2진법), OCT(8진법), DEC(10진법), HEX(16진법) 중 선택이 가능하며,
dafault값으로 실수의 경우 소스점 이하 두자리가 출력된다. 
6 Serial.println(val) 
Serial.println(val,format) 
시리얼 통신 데이터를 시리얼포트로 ASCII형식으로 출력한다. println은 문자열이 끝나면 라인피드를 추가하여 강제줄바꿈을 실행한다.
7 Serial.read() 시리얼 통신 버퍼에서 데이터를 읽어들인다. 
 8 Serial.readBytes(buffer, length) 시리얼 포트에서 문자를 읽어 버퍼에 저장한다. 만약 지정한 길이만큼의 문자를 읽었다면 종료된다.
9 Serial.readBytesUntil(character,buffer,length) 시리얼버퍼에서 문자를 읽어 지정한 버퍼에 저장한다. 지정한 character문자를 찾았거나 지정한 길이만큼의 문자를 읽었을 경우 종료한다.
10  Serial.find(target) 시리얼버퍼에서 target에 해당하는 문자열을 검색할때까지 데이터를 읽는다.
target문자열을 찾으면 true를 반환하고 time out일 경우에는 false를 반환한다.
11  Serial.findUntil(target, terminal) 시리얼버퍼에서 target에 해당하는 문자열을 찾거나 terminal에 해당하는 종료 문자열을 찾을때까지 데이터를 읽는다.
문자열을 찾으면 true를 반환하고 time out이 발생했을 경우 false를 반환한다.
12  Serial.parseFloat() 시리얼버퍼에서 첫 번째 유효한 실수를 반환한다.
데이터가 숫자가 아니거나 음수일 경우에는 넘어간다.
13  Serial.parseInt() 시리얼버퍼에서 첫 번째 유효한 정수를 반환한다. 유효한 정수가 발견되지 않을 경우 0을 반환한다.
14  Serial.peek() read()의 경우에는 데이터를 읽어들이고 그 읽은 데이터는 버퍼에서 삭제하는데 반해,
peek()는 시리얼 버퍼에서 데이터를 제거하지 않고 다음 바이트 데이터를 반환한다. 
15  Serial.setTimeout(time) Serial.readBytesUntil()이나 Serial.readBytes()을 통해 데이터를 읽을 때의 대기시간을 밀리초 단위로 설정한다.
기본값은 1000밀리초이다  
16  Serial.Write(val)
Serial.Write(str)
Serial.Write(buf, len)
이진데이터를 시리얼포트에 쓴다. 이 데이터는 바이트나 바이트열단위로 전송된다.
전송된 문자열의 수는 Serial.print()를 통해 나타난다.
17  Serial.serialEvent() 데이터를 사용가능할때 호출되며 read()함수의 경우 데이터를 수신하였을때 이 함수를 사용한다.

 

 

 



스케치의 시리얼 모니터창은 다음과 같이 구성 돼 있는데 

입력창에는 전송할 데이터를 입력할 때 쓰는 공간이다.
데이터창은 현재 시리얼 통신으로 어떤 데이터가 오고 가는지 볼 수 있다. 이때 데이터를 보려면 print()나 write(), println()을 써줘야 이 창에 입력되어 볼 수 있다.

전송옵션 설정은 데이터를 전송할 때 어떤 방식으로 보낼 것인지에 대해 설정이 가능하다.


Newline이나 Both NL & CR을 할 경우에는 개행문자(\n)을 전송하게 되고 No line ending이나 Carriage return을 선택하면 개행문자가 전송되지 않는다.

전송속도 설정은 시리얼 통신을 할때 전송속도를 설정한다. 비동기 통신이기때문에 속도를 맞춰주어야 하며 속도가 소스에서 설정한 속도와 다를 경우 글자가 깨져서 나오게 된다.

 

 

 

kocoafabeditor

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

클래스, Serial, 기타