본문으로 바로가기

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

category 아두이노/기초 개념 2016.10.04 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)으로 변경해줘야 합니다.




댓글을 달아 주세요

  1. 초보자 2016.10.05 14:33 신고

    항상 꼼꼼하게 알려주셔서 감사합니다.

  2. 대학생 2016.10.05 23:37 신고

    강의 듣다가 궁금한점이 생겨서 질문합니다!
    한글자씩 가져와서 LED제어를 하셨는데 혹시 문장으로 처리할수도 있는지요?
    가령 on이면 led가 켜지고, off이면 led가 꺼지는 것처럼요!
    직접 해보다 보니까 이런 부분은 되질않아서, 어떻게 해야하는지 질문드립니다

    • BlogIcon 코딩런 2016.10.06 11:03 신고

      열심히 봐주셨군요! 감사합니다.
      좋은 질문입니다.
      char형 대신에 String형을 사용하시고, Serial.read() 대신에 Serial.readString()이란 함수를 사용하면 위 예제처럼 비슷하게 코딩하여 실행이 가능하지만 속도가 조금 느린 단점이 있습니다.

      String형 변수를 사용하고 조금만 응용하면 readString()을 사용하지 않고, 속도는 빠르게 구현이 가능합니다.

      String형은 메모리를 많이 차지하기 때문에 문자 배열을 사용하면 속도도 빠르고 메모리도 적게 차지하는 구조로 코딩도 가능합니다.
      (이 부분은 처음 접하시는 분들이 이해하시기에는 조금 어려운 부분이 있어서 제외시키겠습니다)

      댓글로는 정확하게 설명드리기가 어려워 본문 마지막에 질문에 대한 코딩 및 분석글을 올려 놓겠습니다 ^^

    • 대학생 2016.10.06 13:37 신고

      진짜 너무감사합니다.
      꼼꼼하게 설명해주시고 포스팅에 세부코드까지 올려주셔서 죄송하고 감사합니다.
      코딩런 구독하고 열심히 공부하겠습니다.

  3. 스프콘 2017.02.14 14:08 신고

    readString 예제를 따라해보려는데 자꾸 'a' was not declared in this scope 라는 에러 문구가 뜹니다. ㅠㅠ 왜 이런건가요? 똑같이 따라썼는데..

  4. leejy919 2017.05.12 19:13 신고

    혹시 제가 블루투스로 시리얼 통신을 이용하고 있는데 "FF"라는 입력이 들어왔을때 전진하는 코드인데
    잘 실행이 되다 가도 블루투스 신호가 밀려서 "FFFFFFFFF"이렇게 들어오는 바람에 실행이 되지 않습니다. 혹시 시리얼통신에서 해결할수 있는 방법이 있을까요?

  5. 초보자2 2017.05.30 23:36 신고

    선생님 포트 설정을 계속 했는데도, 포트 인식을 얘가 못해요 TT 메일 알려주시면 스크린샷 찍어보내드릴게요.

    • BlogIcon 코딩런 2017.06.01 14:49 신고

      아이쿠 늦은 답변 죄송합니다.
      http://codingrun.com/54

      위 페이지 참고해 보세요.

    • 초보자2 2017.06.05 15:34 신고

      선생님 제 노트북이 윈10kn인데 이 버젼에서 휴대폰도 인식못하더라구요 ;;

      딴 노트북에서 시도해보겠습니다.

  6. 50대 2017.09.05 15:39 신고

    강의 잘 보았습니다. 감사드립니다.~

  7. infovis 2017.10.26 10:20 신고

    오호 대박 재미있어요~^^

  8. 세이 2017.10.28 15:30 신고

    아두이노를 조금 공부를 하고 PLC(LS산전 Master-k80S)의 내장 CNet로 RS-232c통신을 하여 현장에 접목을 시도하려고 합니다.
    제가 알고있는 모든 방법으로 통신을 시도하였으나 PLC측에서 아무 응답이 없습니다. 혹 도움을 받을수 있을까요????
    감사합니다.

  9. 2017.11.20 21:31

    비밀댓글입니다

  10. 왕초보 2017.11.27 14:44 신고

    질문합니다 시리얼모니터에 1~255까지 입력하면 LED가 점점 밝아지는데 256을 입력하게되면 LED가 꺼지게 됩니다. 혹시 그 이유가 무엇때문에 그러는지 알수있을까요?

    • 초보 2017.12.16 05:24 신고

      그거 pwm핀이 8bit라 그렇습니다. 1~255까지 점점밝아지고 256이들어오면 아두이노에서는 0으로 인식하고 led에 불이 안들어옵니다.
      511하면 다시 밝아지는거 확인하실수 있을거에요

티스토리 툴바