Arduino/Serial 통신

시리얼 통신 기초

DesignatedRoom 2020. 10. 19. 18:28

나중에 자바와 시리얼 통신을 할 것이므로 이 부분은 중요하다.

Serial(직렬)통신은 연속적으로 통신 채널이나 컴퓨터 버스를 거쳐 한 번에 하나의 비트 단위로 데이터를 전송하는 과정 

 

Arduino에서 시리얼 통신하는 방법

setup함수에서 Serial.begin(9600)을 호출한다.

Serial.begin함수에서는 초당 전송할 비트수 정의한다.  

이 숫자가 클수록 많이 보낸다. 근데 불안정하다.

Serial.println함수 혹은 Serial.write함수를 사용하여 '시리얼 모니터'에 출력한다.

Serial.read함수를 사용하여 시리얼로 들어오는 1Byte 내용을 입력한다.

Serial.read함수는 입력되는 값을 바이트 단위로 읽는다.

소스 코드

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600); //  바운드 레이트 정의
}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println(Serial.read());

  delay(1000);
}

그리고 위의 소스 코드를 실행해서 '시리얼 모니터' 로 보자.

'시리얼 모니터' 하단에 다음과 같은 목록이 보일 것이다.

각 목록들을 하나씩 선택하고 나서 serial창에 한 문자씩 입력해보자.

각 목록에 따라 다음과 같은 Serial.read함수의 결과를 알 수 있다.

line ending 없음 : 반환 값 없음

새 줄(New Line) : 10

캐리지 리턴(Carriage return) : 13

입력이 없을 경우 255 혹은 -1

 

시리얼 입출력은 8비트로 전송( idle 상태 11111111 전송되므로 255를 출력한다. )

 

아두이노와 PC간의 통신 방향

소스 코드

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600); //  바운드 레이트 정의
}

void loop() {
  // put your main code here, to run repeatedly:
  byte var = Serial.read(); //  PC에서 아두이노 방향의 데이터
  
  Serial.println(var));     //  아두이노에서 PC 방향의 데이터

  delay(1000);
}

 

 

입력된 값을 문자로 표현하는 방법

입력된 값을 문자로 표현하기 위해서는 char형으로 강제 형 변환을 해야 한다.

소스 코드

//  입력된 값을 문자로 표현하기 위해서는 (char)강제 형 변환을 해야 한다.
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600); //  바운드 레이트 정의
}

void loop() {
  // put your main code here, to run repeatedly:
  byte var = Serial.read();   //  PC에서 아두이노 방향의 데이터
  
  Serial.println((char)var);  //  아두이노에서 PC 방향의 데이터

  delay(1000);
}

 

Serial.println함수와 Serial.write함수의 차이

소스 코드

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600); //  바운드 레이트 정의
}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println(10); //  println함수는 2바이트, write함수는 1바이트

  delay(100);
}

 

시리얼 모니터의 출력 결과

 

 

시리얼 통신(한 문자로 LED제어)

다음과 같이 연결해보자. LED는 3번 핀으로 쓸 것이다.

저항은 220옴을 쓴다.

소스 코드

#define   LED_PIN   3 //  LED로 쓸 핀 번호
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600); //  바운드 레이트 정의
}

void loop() {
  // put your main code here, to run repeatedly:

  if (Serial.available())
  {
     char var = (char)Serial.read();

     if (var == '0') {  digitalWrite(LED_PIN,LOW);}
     else if (var == '1'){  digitalWrite(LED_PIN,HIGH);}
  }
  delay(1000);
}

 

 

 

시리얼 통신이 유효할 때만 통신하기

소스 코드

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600); //  바운드 레이트 정의
}

void loop() {
  // put your main code here, to run repeatedly:

  int var = Serial.available();

  Serial.println(var);
  
  delay(1000);
}

코드를 실행하면 키보드 값을 입력할 때마다 값이 증가하는 것을 볼 수 있다.

시리얼 통신 창에서 하단에 아래와 같은 목록이 있다.

위의 목록들 중에서 다른 것으로 선택하고 나서 값을 입력하면 값이 2혹은 3씩 증가하는 것을 볼 수 있다.

아래에서 이 Serial.available함수에 대해 알아보자.

 

 

Serial.available 함수

소스 코드

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600); //  바운드 레이트 정의
}

void loop() {
  // put your main code here, to run repeatedly:

  int var = Serial.available();

  Serial.println(var);

  int var1 = Serial.read();
  
  delay(1000);
}

Serial.available함수는 현재 버퍼에 쌓여 있는 숫자를 읽어 출력한다.

Serial.read함수가 호출되는 순간 한 개의 값이 빠져나가므로 버퍼의 값은 1이 감소하게 된다.

Serial.available함수를 이용하면 버퍼 안에 내용이 있을 때까지 읽어 올 수 있다.

Serial.available함수는 버퍼에 쌓여 있는 개수를 리턴한다.

Serial.available()함수를 이용하면 8개의 데이터를 가지고 올 때 유용하게 처리할 수 있다.
Serial.available()함수의 리턴값이 8일 때, 8번 반복해서 데이터를 쉽게 얻을 수 있다. 

 

 

Serial.read함수

소스 코드

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600); //  바운드 레이트 정의
}

void loop() {
  // put your main code here, to run repeatedly:
  
  if (Serial.read() > 0)
    Serial.println("print");
  
  delay(1000);
}

Serial.read함수는 버퍼에서 하나씩 빼는 함수이다.

위에서 주의할 점은 시리얼 창에서 'line ending 없음'으로 변경하고 실행해야 한다.