Serial 통신 제어 (아두이노)

in #kr-newbie7 years ago

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()

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

Sort:  

오늘은 시리얼 통신!

통신하면은 원격조정하는 출발점이 되는 조금은 어렵지만 재밌는 주제이네요.

아이들 원격조정 RC카 있죠 드론같은것 그런걸 아두이노로 만들면 스마트폰 어플로 블루투스통신을 통해 쉽게 조정이 가능해지죠

오. 그런거구나.

으음 우리가 그냥 주고받고 하는것도 읽었니 받았니?? 하는 신호로 다 체크를 해줘야 하나 보네요... .역시 프로그래밍은 쉽진 않습니다... ㅠㅠ

통신이 간단한 것은 어렵지 않은데 이미지 전송할 때가 좀 많이 배울때 힘들었어요.
데이터 소실도 신경써야하고 받았는지 보냈는지 서로 쌍방이 확인도 해야하고요.
예전 학교 다닐때 채팅 소켓프로그램을 이용해서 실시간 3D 랜더링 한 이미지를 전송하는데 이걸 왜 할려고 했지 참 힘들게 공부했던 기억이 나네요.
그래서 전 통신 제어가 가장 싫어하는 분야이기도 해요.

와우!! 힘내세요!!

네! 감사합니다.

Coin Marketplace

STEEM 0.17
TRX 0.15
JST 0.029
BTC 62036.41
ETH 2418.43
USDT 1.00
SBD 2.61