Разобрать строку Bluetooth

Я занимаюсь разработкой на Android с помощью Bluetooth LTE, я могу отправлять шестнадцатеричные коды, но я отправляю один код за раз, поэтому мне нужно отправлять таким образом много информации, как я могу распознать строку и сохранить данные внутри массив, чтобы проанализировать его позже?

Вот мой скетч:

 char c=' ';
 String inString,one,check;
 char inData[11];
 char inChar;
 int counter=0;
 bool started = false;
 bool ended = false;
 byte index;

boolean NL = true;
const int LED1 = 6;
const int LED2 = 7;
const int LED3 = 2;
const int LED4 = 3;
const int LED5 = 4;
const int LED6 = 5;

void setup() {
   Serial.begin(9600);
    Serial.print("Sketch:   ");   Serial.println(__FILE__);
    Serial.print("Uploaded: ");   Serial.println(__DATE__);
    Serial.println(" ");

    BTserial.begin(9600);  
    Serial.println("BTserial started at 9600");

    pinMode(LED1, OUTPUT);
    pinMode(LED2, OUTPUT);
    pinMode(LED3, OUTPUT);
    pinMode(LED4, OUTPUT);
    pinMode(LED5, OUTPUT);
    pinMode(LED6, OUTPUT);

}

void loop() {

  if (BTserial.available()>0)
    {
      Serial.print("bts: ");
      Serial.println(BTserial.available());
      c = BTserial.read();
      check =  String(c, HEX); 

      if(check=="ffbc"){
        Serial.println("check");
        index=0;
        while (BTserial.available()>0){

            inChar = BTserial.read();
            check=String(inChar,HEX);      
            if(check != "0xfff3")
            {
                inData[index] = inChar;
                index++;
            }
        }
        for (int i=0;i<=11;i++){
          one =  String(inData[i], HEX); 
          Serial.print(i);Serial.print(": ");Serial.println(one);
        };

      }


             if(check=="ffca"){
             // Serial.write(c);
              digitalWrite(LED1, !digitalRead(LED1));
             }
             if(check=="ffcb"){
              //Serial.write(c);
              digitalWrite(LED2, !digitalRead(LED2));
              }
              if(check=="ffcc"){
              //Serial.write(c);
              digitalWrite(LED3, !digitalRead(LED3));
             }
             if(check=="ffcd"){
              //Serial.write(c);
              digitalWrite(LED4, !digitalRead(LED4));
              }
              if(check=="ffce"){
             // Serial.write(c);
              digitalWrite(LED5, !digitalRead(LED5));
             }
             if(check=="ffcf"){
             // Serial.write(c);
              digitalWrite(LED6, !digitalRead(LED6));
              }
    }
}

Без цикла я могу прочитать все отдельные данные, но для моей работы этого недостаточно: для распознавания приложений данных я отправляю «образец строки», чтобы распознать тип информации, которую я хочу отправить.

, 👍2


1 ответ


1

Я думаю, что каким-то образом решил: я всегда отправляю одни и те же коды в начале и в конце данных, чтобы я мог распознать конец, а затем анализировать первый элемент целевого массива. скажите мне, о чем вы думаете, если это может помочь кому-то еще:

 if (BTserial.available()>0)
{
  c = BTserial.read();
  check =  String(c, HEX);      
  if(check!="fff3"){              // я всегда начинаю с fff3
  inData[index] = c;
  index++;
 }
  else if(check=="fff3"){         //конец данных
  index=0;                        //сбрасываем индекс для следующего набора данных
  if(String(inData[1], HEX)=="ffbc"){
    Serial.println("read the next 10 data of the array");
    }else if(String(inData[1], HEX)=="11"){
    Serial.println("turn on led 1");
    }

    // для большего количества операций используйте переключатель/регистр вместо if

  }
,

Почему вы используете строку для проверки начальных/конечных данных? Вы можете просто использовать шестнадцатеричное представление: if(c == 0xfff3). И меня немного смущает, что у вас есть 4-значный шестнадцатеричный код для одной операции чтения. Если вы используете библиотеку SoftwareSerial в качестве объекта BTserial, вызов функции read() возвращает по одному байту за раз, поэтому это будет двухзначный шестнадцатеричный код., @chrisl

привет, я использую плагин Nativescript для Bluetooth, я не знаю, почему, но если я отправлю символ после 9, Arduino получит ffxx (если я отправлю 0xaa, он отправит 0xffaa). Когда я проводил первые эксперименты, я не мог понять набор символов для анализа, поэтому нашел строку. для btserial я использую altsoftserial, @peppeg85