ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 시리얼 통신 기초
    Arduino/Serial 통신 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 없음'으로 변경하고 실행해야 한다.

     

     

    댓글

Designed by Tistory.