본문으로 바로가기

아두이노 기초7. 시리얼통신

category 아두이노/기초 개념 2016. 10. 4. 17:27





시리얼 모니터(Serial monitor)


아두이노와 컴퓨터간에 메세지를 주고받는 장치이다. 아두이노와 컴퓨터가 어떤 값을 주고 받는지 확인할 수 있는 가장 간단한 방법이다.


시리얼 통신(Serial communication)


Serial은 직렬이라는 뜻으로 시리얼 통신은 직렬 통신을 말하며, 연속적으로 통신 채널이나 컴퓨터 버스를 거쳐 한 번에 하나의 비트 단위로 데이터를 전송하는 과정을 말한다.

아두이노 우노의 경우 0번 핀(RX)과 1번 핀(TX)을 통해서 또는 USB연결을 통해서 시리얼 통신을 할 수 있다. 따라서 시리얼 통신을 사용하는 경우 0번과 1번 핀을 디지털 입출력으로 사용할 수 없다. 소스코드를 컴파일하고 USB를 통해 아두이노 보드로 업로드하는 과정 역시 시리얼 통신을 통해 이루어지며, 컴퓨터의 가상 시리얼 포트와 아두이노의 Serial을 통해 통신이 이루어진다.


Baud Rate(통신 속도)


Baud rate는 직렬 전송의 변조 속도를 1초간에 전송되는 신호의 수로 나타낸 값을 말한다. 단위는 bps(bit per second)이다. Baud rate값은 여러가지 값으로 설정할 수 있지만 통신속도에 크게 영향을 받지 않는 경우 일반적으로 9600bps를 사용한다. Baud rate값이 높을수록 송수신 속도가 빠르지만 값이 너무 높거나 양쪽의 설정값이 다른 경우 데이터 수신에 문제가 발생한다. 아두이노에서는 300~250000bps까지 지원하지만, Serial 라이브러리에서는 115200bps까지 지원하므로 115200bps를 초과하지 않도록 주의하자.


Serial.begin(통신속도);


시리얼 통신의 시작을 알린다. 매개변수는 시리얼 통신을 위한 전송속도를 몇 bps로 할 것인지 설정한다. (보통 9600)

ex) Serial.begin(9600);

해석 -> 9600bps의 속도로 시리얼 통신을 시작한다.


Serial.print(출력 값);


시리얼 통신의 데이터를 출력한다. 출력 값은 시리얼 모니터로 확인이 가능하다.

ex) Serial.print("hello ");

     Serial.print("world!!");

출력 결과 -> hello world!!


Serial.println(출력 값);


시리얼 통신의 데이터를 출력한다. print함수와 동일하며 출력 이후 개행 문자(\n)를 추가로 출력한다.

ex) Serial.println("hello");

     Serial.println("world!!");

출력 결과 -> hello

                  world!!


Serial.available();


시리얼 포트에 수신되어 저장되어 있는 데이터의 바이트 수를 반환한다. 시리얼 포트로 수신된 데이터는 64바이트까지 버퍼에 저장된다. 시리얼 통신으로 데이터를 받았는지 확인할 때 많이 쓰이며, 데이터를 받았다면 데이터 갯수를 반환, 받지 않았다면 0을 반환해준다.

< 데이터를 받지 않았으므로 0값을 출력 >


< abc 3개의 데이터를 받았으므로 3을 출력 >

(abc로 붙여서 입력을 하여도 1개의 문자씩 버퍼에 저장되므로 3개의 데이터로 인식한다.)

(스페이스도 문자로 인식하므로 a b c라고 입력할 경우에는 5를 출력한다.)


Serial.read();


시리얼 통신 수신 버퍼에서 첫번째 문자를 읽어 반환한다. 수신 버퍼가 비어 있으면 -1을 반환한다.

< 데이터를 입력하지 않아 버퍼가 비어 있으므로 -1을 출력 >


< AaBb를 입력하면 차례대로 버퍼에 입력되고, 순서대로 출력된다. >

(read()로 데이터를 읽어들이고 출력할 때에는 10진 ASCII코드 값으로 반환한다.)


< char(문자형)으로 출력하면 입력한 값을 그대로 출력할 수 있다. >



Serial.end();


시리얼 통신을 종료할 때 사용한다.


해보기


blink예제를 변형하여 시리얼 모니터에 '1'을 입력하면 led를 ON 그 이외에 문자는 led를 OFF시켜 본다.

< 브레드보드 회로도 >


< 스케메틱 회로도 >


< 아무것도 입력하지 않았을 경우 >


< 1을 입력한 경우 led ON >


< 그 이외에 문자들을 입력한 경우 led OFF >


질문 답변


좋은 질문이 들어와 본문에 답글을 남깁니다.

여러가지 방법으로 시도해 보시는 대학생님의 열정에 박수를 보냅니다 ^^

답변이라고는 하지만 사실 코딩에 정답이란 없습니다. 100명의 사람에게 같은 내용을 주고 코딩해보세요 하면 100가지 답이 나오는게 코딩입니다. 그러니 한가지 주제를 가지고도 여러 방법으로 코딩을 해 보는것도 좋은 습관입니다.

이번 질문에는 2가지 방법으로 답변을 드리도록 하겠습니다.


1. Serial.readString(); 함수 사용하기

https://www.arduino.cc/en/Serial/ReadString 아두이노 공식 홈페이지에서 Reference를 보면 readString()이라는 함수 사용법이 나옵니다. 이 함수를 이용하여 손쉽게 문자열로 제어가 가능합니다. ( 다만 속도가 조금 느리다는 단점이 있습니다. )

강의에서 나오는 Serial.read() 함수와 사용법이 비슷하게 사용이 가능합니다. 여기서 주의할 점은 char형 대신에 String형으로 바꿔주어야 한다는 점입니다.


2. 문자를 더해 문자열로 만들어 조건 분석

loop를 돌면서 '\n'(엔터)문자가 입력되기 전까지 문자를 전부 합쳐서 on인지 off인지 판별하는 코드입니다. 문자열 변수 s에 문자가 계속 합쳐지므로 \n을 만나면 각 조건을 처리하고 변수 s를 공백으로 초기화(버퍼를 비운다 정도로 이해하면 됨) 해주면서 led를 제어하게 됩니다.  

'\n'(새줄, 엔터)을 인식하기 위해 전송옵션을 새 줄(new line)으로 변경해줘야 합니다.