본문 바로가기

ESP32

ESP32 SerialBT 사용할 때 파싱 문자 반복 인식

반응형

데이터를 보내도 앞의 문자들이 같으면 같은 것으로 인식하는 경우가 발생

 

그러니까 stop 문자와 stopoff를 같은 문자열로 인식하는 경우 해결

 

원래 코드

 

  // Read received messages
  if (SerialBT.available()){
    char incomingChar = SerialBT.read();
    if (incomingChar != '\n'){
      message += String(incomingChar);
    }
    else{
      message = "";
    }
    Serial.write(incomingChar);  
  }
  // Check received message and control output accordingly
  if (message =="stop"){
    digitalWrite(LSTOP, HIGH);
    SerialBT.print("LSTOP on");
  }
  else if (message =="stopoff"){
    digitalWrite(LSTOP, LOW);
    SerialBT.print("LSTOP off");
  }

 

 

Serial Bluetooth Terminal로 테스트 하면 같은 문자열로 인식해 위 코드처럼 LSTOP ON 메시지가 연속으로 찍히는 일이 발생한다. 아래 수정 코드를 반영하니 명확히 인식한다.

 

수정한 코드

 

Bluetooth가 몇 가지 추가 변수를 전송한다는 것을 알고 있었지만 이를 감지하고 삭제하는 방법을 몰랐습니다. 하지만 이미 해결책을 찾았습니다.

 

먼저 text = SerialBT.read(); 를 사용하여 추가 문자를 감지했습니다. 블루투스는 문자열 데이터 끝에 추가 문자를 전송합니다. 그래서 text.remove(text.length()-1,1); 를 사용했고 모든 것이 이미 올바르게 작동하고 있습니다.

 

코드 완성: 

#include "BluetoothSerial.h"

String text = "";

#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif

BluetoothSerial SerialBT;

void setup() {
  Serial.begin(115200);
  SerialBT.begin("ESP32"); //Bluetooth device name
;}

void loop() {
  if (SerialBT.available() > 0) {
    text = SerialBT.readStringUntil('\n');
    Serial.println(text);
    if(text == "go") {
       Serial.println("Info");
    }
  }
  delay(20);
}

 

 

 

 

 

 

반응형

더욱 좋은 정보를 제공하겠습니다.~ ^^