[아두이노] Serial 통신 제어

IOT/아두이노|2019. 3. 13. 09:00

[아두이노] Serial 통신 제어



원래 시리얼 통신은 초반부에 자세히 소개 했어야 했는데 프로세싱+아두이노 연결을 하면서 그냥 넘어가면 안될 것 같아서 이제서야 소개하게 되었네요. 센서 부품를 다룰때 그 결과를 출력하는데 많이 사용하기 때문에 매우 중요합니다. 나중에 블루투스 통신에서도 사용하니깐 위에 참고출처를 링크한 아두이노 홈페이지의 레퍼런스를 잘 살펴보시기 바래요. 오늘은 시리얼통신 기본만 소개하겠습니다.

1. Serial 통신



그림에서 보듯이 아두이노 IDE 시리얼모니터에서 아두이노로 "123"이란 값을 보내게 됩니다. 그리고 나서 아두이노는 이 값을 읽어서 다시 아두이노 IDE로 데이터를 보내고 시리얼모니터로 그 값을 출력합니다.

[ 기본 소스 ]

void setup() {
  Serial.begin(9600);    //시리얼 통신 9600 통신속도로 시작
}
void loop() {
  
  if (Serial.available() > 0) { //데이터가 수신되는지 확인
    char ch = Serial.read(); //1byte 읽음
    Serial.println(ch); //1byte 읽은거 출력
  }
}

기본 소스의 주석을 다 달았습니다. 주석만 읽으시면 대충 어떻게 통신이 이루어지는 아시겠지요.

위 이미지에서 123을 보내면 아두이노에서 1, 2, 3 이렇게 하나씩 아두이노 IDE에 출력되는 이유가 과연 뭘까요. 이것은 123을 전송했는데 byte 단위로 읽고 char(문자형) 변수 ch에 1byte 문자가 저장되는데 "123" 값에서 순차적으로 '1','2','3'을 저장하고 순자척으로 Serial.println('1'), Serial.println('2'), Serial.println('3') 이렇게 출력하게 됩니다.
이걸 정수형으로 받으면

2. 시리얼 통신 함수


기본

  • Serial.begin(통신속도) : 시리얼통신 시작. 기본통신속도는 9600을 많이 사용합니다.
    많은 아두이노 시리얼통신에서 9600을 사용합니다.
    통신속도 : 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200
  • Serial.end() : 시리얼통신 중단
  • Serial.available() : 데이터 도착했는지 확인
  • Serial.println(데이터) : 데이터를 상대쪽으로 전송(출력)
  • while(!Serial) : 통신 연결 확인(연결 안되면 무한 루프를 돌면서 연결을 기다림)

위 함수중에서 abailable()함수만 좀 더 살펴보도록 하죠.

예제)


데이터가 들어왔는지 상태값을 확인하는게 available()함수라고 했죠. 그러면 정확히 어떤값이 들어있는지 시리얼 모니터에 출력을 해봤습니다. 'a'라는 문자를 보내면 아두이노는 available()함수에 수신이 되면 수신되었다고 1의 상태값을 갖게 됩니다. 그러면 if문이 참이고 첫라인에서 출력이 '1'이 나오게 됩니다. 그다음 read()함수로 데이터를 읽고 정상적으로 시리얼모니터로 'a'가 두번째라인에 출력 됩니다. 그러면 데이터를 read()함수로 읽었다면 다음 available()함수의 상태값은 데이터를 읽었기 때문에 지워지고 상태값은 '0'이 됩니다 즉, read()으로 읽고 나면은 abailable()은 초기화 상태가 되는 것이죠. 그래서 세번째 라인이 0이 출력 됩니다.
쉽게 말해서, 데이터가 전송되면 available() 함수는 '1'의 상태가 되고 데이터를 읽고나면 '0'의 상태가 됩니다. 아래 그림을 보시면 좀 더 쉽게 이해가 되시겠지요.


begin(), available(), read(), print(), println() 정도만 우선 알아두시고 아래에서 소개하는 함수들 읽기와 출력에 대해 몇가지 소개만 하고 나머지는 레퍼런스를 참고해 주세요. 나중에 센서값을 어떻게 읽고 어떻게 출력할지 그 센서에 따라서 표현이 좀 달라지니깐요 레퍼런스를 꼭 봐주셔야 해요. 가상시뮬레이터에서는 위 5가지 함수만 기본 베이스로 이해하시고 사용하시면 쉽게 실험하실 수 있을꺼에요.


읽기

  • Serial.read() : 1byte 읽음
  • Serial.readBytes(buffer, length) : buffer에 length 길이만큼 읽음
  • Serial.readBytesUntil(character, buffer, length) : buffer에 length 길이만큼 읽어오는데 character가 끝문자 표시로 이문자가 있는 곳까지 읽어오게 됨.
    예) Serial.readBytesUntil('s', buffer, 10)일때 전송데이터 "100s1000"이면 buffer "100"이 첨에 저장되고 다음에 "1000"이 저장됨.
  • Serial.parseInt() : 정수형으로 읽기
  • Serial.parseFloat() : 실수형으로 읽기

출력

  • print(값) : 데이터를 출력하고 현재 라인에 커서가 그대로 유지됨.
  • println(값) : 데이터를 출력하고 새로운 라인으로 커서가 이동함.(Enter로 생각하시면됨)

주의 :

  • print(값) : 데이터를 아스키코드값 바꿔서 전송.
  • wirte(값) : 데이터를 그대로 전송.


위 그림에서 보는 것 처럼 print()함수는 '7'이란 값을 전송할때 '55'라는 아스키코드값으로 전송하고 그 값이 출력되는 걸 보실꺼에요. 하지만 write()함수는 '7'을 그래도 전송하고 받는쪽에서는 '7'을 아스키코드값으로 여기고 출력된다는 차이점을 보입니다. 둘 차이를 잘 비교하세요.


마무리


그외도 여러 함수들이 있는데 오늘 소개한 함수들도 몇개를 제외하고는 잘 사용하지 않습니다. 가상시뮬레이터에서는 그냥 단순하게 read(), print(), println()정도로 데이터를 읽거나 쓰는 정도만 합니다.

- if(Serial.available()) {  }
- while(!Serial){  }
- Serial.read()
- Serial.print()
- Serial.println()

이정도 함수만 외워두시면 기본적인 통신을 할 수 있습니다. 나중에 센서를 이용한 특정값이나 부품을 제어하는 통신을 할 경우에는 레퍼런스를 살펴 보셔야 겠지만 우선은 시리얼통신이 어떻게 이루어지는지만 살펴보세요.

댓글()