ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 시리얼 통신에 사용되는 함수
    Arduino/Serial 통신 2020. 10. 20. 19:22

    readBytes함수 & readreadBytesUntil 함수

    시리얼 통신에 사용되는 찾기함수이다.

    소스 코드

    //  함수들에 대해 알아보자.
    //  readBytes함수
    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
    
      Serial.setTimeout(2000);  //  기본은 1000(1초)를 의미
                                
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
      char temp[100];
    
      //  입력이 있으면
      if (Serial.available() > 0)
      {
        //  byte len = Serial.readBytes(temp,10);
        byte len = Serial.readBytesUntil('0',temp,10);  //  '0'을 구분함. 문자를 분리할 때 많아 쓴다.
        Serial.print(len);
    
        for (int i = 0; i < len; i++)
        {
          Serial.print(temp[i]);
        }
        Serial.println();
      }
    }

     

     

     

    readBytes함수를 활용한 시리얼 통신 Handshaking

    아래의 내용이 시리얼 통신 Handshaking에 관한 내용이다.

    소스 코드

    //  시리얼 통신 Handshaking
    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
      establishConnection();
    }
    
    void establishConnection()
    {
      char buffer[100];
      Serial.println("hi server\'OK'");
    
      while (1)
      {
        if (Serial.available())
        {
          int readCount = Serial.readBytes(buffer,99);
          buffer[readCount] = '\0';
      
          Serial.println("receiver message : " +String(buffer));
      
          if (String("OK").equals(buffer))
            break;
        }
      }
      Serial.println("Thank you");
    }
    
    void loop() {}

    시리얼 모니터에서 'line ending 없음' 으로 선택을 해야 한다. 종료 조건이 순수 "OK"만을 입력했을 때이다.

    위의 establishConnection함수에서 선언한 변수 buffer는 크기가 100이며 입력받을 내용은 문자열이기 때문에
    readBytes함수에서는 99만큼만 읽어야 한다. 그 이유는 마지막 자리에 널 문자를 삽입해야 하기 때문이다.

    if( SerialSerial.available()) 문장은 외부에서 입력이 있을 때 참이 되어 if내의 문장이 실행된다.

    즉, 입력한 문자가 있으면 if 내로 들어온다. 

     

     

     

    substring 함수

    시리얼 모니터에서 'line ending 없음'으로 보도록 하자. 출력 결과는 abc가 나온다.

    소스 코드

    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
    
      String buf = "abcdefg";
    
      //  substring함수의 두 번째 매개변수인 3번 인덱스에 '\0'가 채워짐
      Serial.println(buf.substring(0,3)); 
    }
    
    void loop() {}

     

     

     

    문자열 함수 indexOf와 substring 함수(String 클래스 내의 함수)

    시리얼 모니터에서 'line ending 없음' 으로 두고 실행하자.

    소스 코드

    더보기
    //  문자열 함수를 이용해서 ':'을 중심으로 문자열을 나누기.
    //  보낸 데이터를 받는 형식
    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
    
      establishConnection();
    }
    
    void loop() {}
    
    void establishConnection()
    {
      char buf[100];
    
      Serial.println("hi server\'OK'");
    
      while (1)
      {
        //  외부에서 입력이 있을 때
        if (Serial.available())
        {
          int readCnt = Serial.readBytes(buf,99);
    
          buf[readCnt] = '\0';
    
          //  Serial.println("receiver message : " +String(buf));
          
          int pos = String(buf).indexOf(':');
    
          // substring함수에서 pos인덱스 위치에 '\0'문자 삽입
          String command = String(buf).substring(0, pos);   
    
          Serial.println("분리 명령 : " +command);
    
          // substring함수에서 readCnt인덱스 위치에 '\0'문자 삽입
          String value = String(buf).substring(pos + 1,readCnt); 
    
          Serial.println("분리값 : " +value);
          
          if (String("OK").equals(buf)) {break;}
    
          else if (String("IP").equals(command))
            {Serial.println("IP설정");}
    
          else if (String("PORT").equals(command))
            {Serial.println("PORT설정");}
    
          else {Serial.println("명령이 잘못되었습니다.");}
        }
      }
      Serial.println("Thank you");
    }

     

     

     

     

    micros함수 & flush함수

    micros함수를 이용해서 데이터 처리하는 시간을 구할 수 있다.

    이 함수는 중요하다. 그 이유는 나중에 버튼에 대한 처리를 하기 때문이다.

    fflush함수는 시리얼 통신에 사용되는 버퍼 비우는 함수이다.

    소스 코드

    //  데이터 처리하는 시간 구하기
    char* buf = "test message";
    
    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
    
      unsigned long int t;
    
      for (int i = 0; i < 10; i++)
      {
        t = micros();         //  현재의 시간을 잰다.
        Serial.println(buf);
        Serial.flush();       //  버퍼를 지우는데 걸리는 시간이 조금 걸린다.
        Serial.println(micros() - t); //  현재의 시간에서 그 이전의 시간을 뺀다.
      }
    
      while (1);
    }

     

     

    serialEvent함수

    소스 코드

    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
    }
    
    void loop() {}
    
    //  알아서 available상태를 체크함
    void serialEvent()
    {
      char c = Serial.read();
    
      Serial.print("rx : ");
      Serial.println(c);
    }

     

     

     

    parseInt 함수

    parseInt함수말고 Serial.parseFloat함수도 있다.

    소스 코드

    더보기
    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())
      {
        Serial.println(Serial.parseInt());
    
         if (Serial.read() != '\0');
      }
    }

     

     

     

    find 함수 

    소스 코드

    void setup() {
      Serial.begin(9600);
    }
    
    long temp = 0;
    
    void loop() {
      while (Serial.available())
      {
        if (Serial.find("f"))
          temp = Serial.parseInt();
        else
          temp = 0;
    
        Serial.print("temp value = ");
        Serial.println(temp);
      }
    }

     

     

     

    findUntil 함수

    소스 코드

    void setup() {
      Serial.begin(9600);
    }
    
    long temp = 0;
    
    void loop() {
      while (Serial.available())
      {
         Serial.println(Serial.findUntil("f","T"));
      
      }
    }

     

    댓글

Designed by Tistory.