Arduino/Serial 통신

시리얼 통신과 문자열 활용 - LED

DesignatedRoom 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));
       }
  }
}