Дублирование строки считывания с последовательного порта блютуза
- Войдите на сайт для отправки комментариев
Пнд, 18/07/2016 - 23:00
Коллеги, вечер добрый!
Не могу разобраться с проблемой. Значит такая ситуация у меня блютуз модуль 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. Помогите разобраться. Ну и заодно может упрастить можно код как-то.
Если кому интересно - то проблема была в программе терминала + код.
Значит сама программа называется 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; }