Дублирование строки считывания с последовательного порта блютуза

leejack
Offline
Зарегистрирован: 30.01.2014

Коллеги, вечер добрый!

Не могу разобраться с проблемой. Значит такая ситуация у меня блютуз модуль HC-05 с base board.

Написал подпрограмму для считывания всех данных, которые я отправляю на этот модуль. Но почему-то при запросе текущей строки иногда она дублируется (ощущение, что последовательный порт не очищает буфер), а иногда норм. 

Также, решил посмотреть сколько раз программа залазает в мою функцию считывания строки из порта, всегда строго два. Вот листинг 

char incomingByte;  // входящие данные
int  LED = 13;      // LED подключен к 12 пину
int STATE = 6; //STATE BT
boolean flag = false;
String BT_String;

 int countt = 1;
void setup() {
  Serial2.begin(9600); // инициализация порта
  pinMode(LED, OUTPUT);
  pinMode(STATE, INPUT);  
  Serial.begin(9600);

  Serial2.print("Current state bluetooth connection: ");
  Serial2.println(state_connect());
}
 
void loop() {     
    if (readBT() == true) {
      countt++;
      if (BT_String == "STATE") Serial.println(state_connect());
      Serial.println(BT_String);
      //delay(500);
      Serial.println(countt, DEC);
      //delay(300);
    } else {      
      //Serial.println("Clear");
      //delay(100);
    }       
}


boolean state_connect() {
  if (digitalRead(STATE)) return true;
    else return false;
}

boolean readBT() {  
  boolean flagStop = false;
  BT_String = "";     
  if (Serial2.available() > 0) {              //Если пришли данные во второй порт (от блутуса)    
    while (flagStop == false) {               //Флаг остановки считывания с порта БТ, если истина, значит конец строки
      int inChar = Serial2.read();            //Считываем очередной символ
      if (inChar >= 0)                        //Убираем символы начала пакета вида "яяяяяя..."
        if (inChar == '\n') flagStop = true;  //Отлавливаем конец строки
          else BT_String += (char)inChar;     //Считываем в строку значение из порта блютуса              
    } return true;                            //Возвращаем истину, если значение считано успешно        
  } else return false;                        //Ложь, если порт БТ пустой          
}

Собственно в функцию readBT() программа залазеет по два раза, прежде, чем возвращаемое значение функции действительно станет false. Помогите разобраться. Ну и заодно может упрастить можно код как-то. 

 

leejack
Offline
Зарегистрирован: 30.01.2014

Если кому интересно - то проблема была в программе терминала + код.

Значит сама программа называется Bluetooth Terminal под Win10 в магазине купленная, она почему-то дважды отправляла сообщение. Ну и сам код слишком громоздкий оказался - вот его правильное решение при условии, что конец строки обозначен как \n (каретка на след. строку)

Если другой символ, то корректируйте в соответствующем месте.

boolean readBT() {  
  boolean flagStop = false;                         //Флаг, указывающий на конец необходимой строки
  int inChar;                                       //Переменная для сбора данных с порта
  
  while (Serial2.available() > 0) {                 //Если пришли данные во второй порт (от блутуса)        
      inChar = Serial2.read();                      //Считываем очередной символ            
        if (inChar > -1) {                          //Убираем символы начала пакета вида "яяяяяя..."
          if (inChar == '\n') flagStop = true;      //Отлавливаем конец строки
          if (!flagStop) BT_String += (char)inChar; //Считываем в строку значение из порта блютуса игнорируя символы Я и переход на следующую строку              
        }        
  }           
  if (flagStop) return true; else return false;  
}