ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 시리얼 통신과 문자열 활용 - LED
    Arduino/Serial 통신 2020. 10. 20. 19:16

     

    1. 시리얼 통신을 통해 문자열을 입력받아 출력

    아래의 예제를 실행하면 문제가 있다.

    그 이유는 입력받아 출력한 문자들이 계속 변수 str 에 쌓여있어서 기존에 입력한 문자들이 같이 출력된다.

    소스 코드

    //  시리얼 통신을 통해 문자열을 입력받아 출력하기
    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
    }
    
    char ch;    //  전역 변수
    String str; //  전역 변수
    
    void loop() {
      // put your main code here, to run repeatedly:
    
      //  입력한 데이터가 있을 때, 버퍼에서 하나씩 데이터를 읽어들인다.
      while (Serial.available() > 0)
      {
        ch = Serial.read();
        str.concat(ch);   //  문자열을 잇는 함수
        delay(10);
        Serial.println(str);
      }
    }

     

     

    2. 시리얼 통신을 통해 문자열을 입력받아 출력 문제 해결1

    소스 코드

    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
    }
    
    char ch;
    String str;
    
    void loop() {
      // put your main code here, to run repeatedly:
      
       //  입력한 데이터가 있을 때, 버퍼에서 하나씩 데이터를 읽어들인다.
      while (Serial.available() > 0)
      {
        ch = Serial.read();
        str.concat(ch);   //  문자열을 잇는 함수
        delay(10);
    
        //  추가한 부분
        if (Serial.available() == 0)
        {
          Serial.println(str);
          str = ""; //  버퍼를 비워줘야 한다. 계속 입력한 문자가 쌓여있다.
        }
      }
    }

     

     

     

    3. 시리얼 통신을 통해 문자열을 입력받아 출력 문제 해결2

    이 예제는 시리얼 모니터에서 '새 줄'을 선택해서 실행해야 한다.

    그 이유는 엔터 키 입력을 받아야 하기 때문이다.

    즉, 엔터 키 입력 전까지가 우리가 출력할 문자열이다.

    소스 코드

    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
    }
    
    char ch;
    String str;
    
    void loop() {
      // put your main code here, to run repeatedly:
      
       //  입력한 데이터가 있을 때, 버퍼에서 하나씩 데이터를 읽어들인다.
      while (Serial.available() > 0)
      {
         ch = Serial.read();
    
         // 엔터키가 입력되면
         if (ch == '\n')
         {
          Serial.println(str);
          str = "";
          break;
         }
         str.concat(ch);
        delay(10);
      }
    }

     

     

     

     

     

     

     

    4. 시리얼 통신을 통해 문자열을 입력받아 출력 문제 해결3

    소스 코드

    //  시리얼 통신을 통해 문자열을 입력받아 출력하기
    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
    }
    
    char ch;    //  전역 변수
    String str; //  전역 변수
    
    void loop() {
      // put your main code here, to run repeatedly:
    
      if (Serial.available() > 0)
      {
        ch = Serial.read();
        str.concat(ch);   //  문자열을 잇는 함수
        delay(10);
    
        //  버퍼에 데이터가 없으면 바로 출력한다.
        if (Serial.available() == 0)
        {
          Serial.println(str);
          str = "";   //  str의 변수의 버퍼를 비운다.
        }
      }
    }

     

     

     

     

    5. 시리얼 통신을 통해 문자열을 입력받아 출력 문제 해결4

    아래의 내용을 실행할 때는, 시리얼 모니터에서 '새 줄' 혹은 'Both NL & CR'을 선택하자.

    그 이유는 한 문자열의 입력에 대한 조건은 엔터 키가 입력이 될 때까지 이다.

    소스 코드

    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
    }
    
    char buffer[100];
    char cnt = 0;
    char ch;
    String str;
      
    void loop() {
      // put your main code here, to run repeatedly:
      
      //  입력한 데이터가 있을 때, 버퍼에서 하나씩 데이터를 읽어들인다.
      while (Serial.available())
      {
        char var = (char)Serial.read();
    
       // 엔터키가 아니면, 데이터를 저장한다.
       if (var != '\n')
       {
          buffer[cnt] = var;
          cnt++;
       }
       // 엔터 키가 입력되면, 한 문자열 입력에 대해 종료
       else
       {
          buffer[cnt] = '\0'; //  널 문자 삽입
          Serial.println(buffer);
          memset(buffer,0,sizeof(buffer));
          cnt = 0;
       }
      }
    }

     

     

     

     

    문자열을 이용하여 LED 켜고 끄기1

    소스 코드

    //  시리얼 통신을 통해 문자열을 입력받아 
    //  입력받은 문자열이 ON, OFF일 때 LED를 켜고 끄기
    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
    
      pinMode(3,OUTPUT);  //  LED 출력 핀으로 3번 핀을 쓸 것이다.
    }
    
    String str;
    char ch;
    
    void loop() {
      // put your main code here, to run repeatedly:
      
      //  입력한 데이터가 있을 때, 버퍼에서 하나씩 데이터를 읽어들인다.
      while (Serial.available() > 0)
      {
        ch = Serial.read();
        str.concat(ch);   //  문자열을 잇는 함수
        
        delay(10);
        Serial.println(str);
    
        if (str == "ON")
        {
          digitalWrite(3,HIGH);
        }
        else if (str == "OFF")
        {
          digitalWrite(3,LOW);
        }
        str = "";
      }
    }

     

     

     

     

     

     

    문자열을 이용하여 LED 켜고 끄기2

    실행 시에 시리얼 모니터에서 '새 줄' 혹은 'Both NL & CR'을 선택해야 한다.

    그 이유는 엔터 키 입력을 받아야 한다.

    소스 코드

    //  시리얼 통신을 통해 문자열을 입력받아 
    //  입력받은 문자열이 ON, OFF일 때 LED를 켜고 끄기
    
    void setup(){
      // put your setup code here, to run once:
      Serial.begin(9600);
    }
    
    char buffer[100];
    char cnt = 0;
    String str;
      
    void loop() {
      // put your main code here, to run repeatedly:
      
      //  입력한 데이터가 있을 때, 버퍼에서 하나씩 데이터를 읽어들인다.
      while (Serial.available())
      {
        char var = (char)Serial.read();
    
       // 엔터키가 아니면, 데이터를 저장한다.
       if (var != '\n')
       {
          str += var;
       }
       // 엔터 키가 입력되면, 한 문자열 입력에 대해 종료
       else
       {
          Serial.println(str);
    
          if (str.equals("ON"))
            Serial.println("LED ON");
          else if (str.equals("OFF"))
            Serial.println("LED OFF");
          else
            Serial.println("NOT COMMAND");
    
          str = "";
       }
      }
    }

     

     

     

     

    문자열을 이용하여 LED 켜고 끄기3

    실행 시에 시리얼 모니터에서 '새 줄'을 선택해야 한다.

    그 이유는 엔터 키 입력을 받아야 한다.

    소스 코드

    //  시리얼 통신을 통해 문자열을 입력받아 
    //  입력받은 문자열이 ON, OFF일 때 LED를 켜고 끄기
    
    void setup(){
      // put your setup code here, to run once:
      Serial.begin(9600);
    }
    
    char buffer[100];
    char cnt = 0;
    String str;
      
    void loop() {
      // put your main code here, to run repeatedly:
      
      //  입력한 데이터가 있을 때, 버퍼에서 하나씩 데이터를 읽어들인다.
      if (Serial.available())
      {
          char var = (char)Serial.read();
    
            // 엔터키가 아니면, 데이터를 저장한다.
           if (var != '\n')
           {
              buffer[cnt] = var;
              cnt++;
           }
           else
           {
              buffer[cnt] = '\0'; //  널 문자 삽입
              Serial.println(buffer);
              
              if (!strcmp(buffer,"ON"))
                Serial.println("LED ON");
              else if (!strcmp(buffer,"OFF"))
                Serial.println("LED OFF");
              else
                Serial.println("NOT COMMAND");
    
              cnt = 0;
              memset(buffer,0,sizeof(buffer));
           }
      }
    }

     

    댓글

Designed by Tistory.