오늘은 시리얼 통신에 대해서 공부했다. 사실 시리얼 통신에 대해서 공부했다기 보다는,
사용법에 대해 공부했다고 보는게 맞겠다.
먼저 시리얼 통신에 대해 간략하게 사용하자면,
"기기와 기기끼리 직렬(Serial)로 데이터를 주고받는 것"
이라고 간략히 말할 수 있겠다.
(공부를 하면서 배운 것들을 블로그에 쓰려고 보니, 이 텍스트만으로는 너무 부족하다는 생각이 드는게
태블릿이라도 하나 사야될 듯 싶다.)
오늘도 자세한 설명글은 다음으로 미루기로 하고, 사용법에 대해 설명하겠다.
1. 시리얼 통신 입력값 출력
아두이노를 컴퓨터에 연결하고 다음과 같은 코드를 스케치한다.
void setup() {
Serial.begin(9600); // 시리얼 통신을 해라. 9600보드레이트로.
}
void loop() {
if(Serial.available()) // 만약 시리얼통신이 가능하다면
{
Serial.println(Serial.read()); // 시리얼 통신으로 넘어오는 데이터들을 그대로 출력해라
}
}
그리고,
우측 상단 버튼을 눌러 시리얼 모니터를 열고, 우측 하단에서 보드레이트를 9600으로 수정해준 뒤, 값을 입력해본다.
사진은 차례대로 1,2,3을 입력한 결과물이고, 아스키코드 값으로 반환되는 것을 알 수 있다.
(아스키코드 : ko.wikipedia.org/wiki/ASCII)
2. 시리얼 통신을 통한 문자열 출력
void setup() {
Serial.begin(9600); // 시리얼 통신을 해라. 9600비트레이트로.
}
void loop() {
Serial.print("hello world"); // hello world를 출력해라.
Serial.end(); // 시리얼 통신을 종료해라.
}
시리얼 통신을 통해 "hello world"라는 문자열을 출력한 후 통신을 종료하는 코드이다.
만약 Serial.end() 를 쓰지 않으면, loop 문을 따라 문자열이 무한히 출력된다.
3. 시리얼 통신을 통한 LED 켜기
void setup() {
Serial.begin(9600); // 시리얼 통신을 해라. 9600비트레이트로.
pinMode(10,OUTPUT); // 10번 핀을 출력모드로 설정해라
}
void loop() {
if(Serial.available()) // 만약 시리얼 통신으로 데이터가 들어온다면
{
int power = Serial.read(); // power 라는 변수에 입력값을 대입해라
if (power == 49) // 만약 power 가 49 라면 10번 핀을 ON
digitalWrite(10,1);
else // 49가 아니면 10번 핀을 OFF
digitalWrite(10,0);
}
*49는 1의 아스키 코드 값이다.
여기서 재밌었던 것은,
if (Serial.available()) 코드를 제거 했을 때, LED가 켜진 채로 유지가 되지 않았던 것이다.
처음에 나는 이 코드가 형식상 들어가는 줄 알았으나, 찾아보니
'직렬 포트로부터 읽을 수 있는 바이트의 수를 가져오는 함수' 라고 한다.
(참조 : www.arduino.cc/reference/ko/language/functions/communication/serial/available/)
그러니까, 아두이노는 데이터를 입력 받으면 시리얼 버퍼라는 메모리에 값을 저장시키는데,
이 함수는 그 버퍼에 저장된 데이터의 길이를 가져오는 함수라는 것이다.
그러니까, 어떤 데이터가 들어가면 무조건 적으로 결과값이 나오는 함수이므로,
무한루프를 방지하기 위한 입력 대기용 함수로 쓰이는 것 같았다.
4. 마치며
기기와 소통할 수 있는 통신방법을 배웠다. 이로써 입력값을 바꿔가며 출력값을 다르게 할 수 있어
수 많은 활용이 가능할 것이라 생각한다. 예를 들면 입력값에 따른 LED의 밝기 변화라든지.
참조: www.youtube.com/watch?v=vsuiqTxaiGs&t=666s
추가)
3번 코드 첫번째 if 에 대해서는 중괄호를 사용하고, 두번째 if 에서는 중괄호를 사용하지 않는 이유
: C언어 문법 상, if, else 문으로 실행할 코드가 두 줄 이상이면 중괄호를 사용해야하고,
한 줄 이라면 중괄호를 생략할 수 있다.