Разбор данных и сравнение двух строк в arduino

Я работаю над своим последним заданием. Проблема в том, что я хочу сделать инструмент-прототип с сравнением двух строк. Если я отправлю данные «OK DISC DISCLOSED: 341513DB689AOK RSSI: -056 OK NAME: CarBT1 OK DISCE», они будут проанализированы и выведут данные «CarBT1 OK DISCE», если данные верны, светодиод включится, но моя программа не т работает? кто-нибудь знает проблему?

String dataIn; 
String dt[10];
int i;
boolean parsing=false;
const int pinLED = 8;
String readString;

void setup (){
  Serial.begin(9600);
  pinMode(pinLED, OUTPUT);
  Serial.print("Sketch:   ");   Serial.println(__FILE__);
  Serial.print("Uploaded: ");   Serial.println(__DATE__);
  Serial.println(" ");
  while(!Serial){
    ;
  }
}

void loop (){
  if(Serial.available()>0) {
  char inChar = (char)Serial.read();
  dataIn += inChar;
  if (inChar == '\n'){
  parsing = true;
  }
}
if(parsing){
  parsingData();
  parsing=false;
  dataIn="";
}
while(Serial.available()){
  delay(3);
  char c =  Serial.read();
  readString += c;
}
readString.trim();
  if(readString.length()>0){
    if(readString == "CarBT1 OK+DISCE"){
      digitalWrite(pinLED, HIGH);
      Serial.println("Switching On");
   }
  if(readString == "off"){
      digitalWrite(pinLED, LOW);
      Serial.println("Switching Off");
   }
readString = "";
 }
}

void parsingData(){
int j=0;
Serial.print("data masuk : ");
Serial.print(dataIn);
Serial.print("\n");
dt[j]="";
for(i=1;i<dataIn.length();i++){
  if ((dataIn[i] == ':') || (dataIn[i] == ':')){
  j++;
  dt[j]="";
}
  else{
  dt[j] = dt[j] + dataIn[i];
  }
 }
}
Serial.print("data 1 : ");
Serial.print(dt[0]);
Serial.print("\n");
Serial.print("data 2 : ");
Serial.print(dt[1]);
Serial.print("\n");
Serial.print("data 3 : ");
Serial.print(dt[2]);
Serial.print("\n\n");
Serial.print("data 4 : ");
Serial.print(dt[3]);
Serial.print("\n\n");
}

, 👍0

Обсуждение

Частью вашего задания является изучение навыков отладки. Спросите себя, что ДЕЙСТВИТЕЛЬНО работает и где это начинает идти не так? Стройте оттуда., @user_1818839

ваш код имеет непоследовательный отступ ..... что затрудняет отслеживание хода программы ..... попробуйте исправить отступ вашего кода, @jsotola


1 ответ


1

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

У вас есть два последовательных цикла чтения. Первый завершается, как только не остается символов для чтения (даже если некоторые из них могут быть в пути). Когда "\n" читается, вы устанавливаете синтаксический анализ, но это не означает, что \n удаляется из dataIn.

Второй цикл последовательного чтения while использует задержку(3) после обнаружения того, что символ доступен, но этот символ мог появиться после первого чтения и быть, например, единственным символом в буфере.

Я подозреваю, что причина того, что ваше сравнение строк не работает, заключается просто в том, что строки не равны.

Ваша строка выглядит как что-то, прочитанное из HM-10/11 или чего-то подобного. Мне удалось прочитать эти передачи, выполнив следующие действия:

Убедитесь, что последовательный буфер пуст. Когда символ доступен, считывайте его в строку построения, но продолжайте искать символы, которые доступны в течение установленного периода времени (возможно, пару секунд). Продолжайте искать символы, пока не истечет время, а не до тех пор, пока не закончатся доступные символы (потому что могут появиться новые). В качестве альтернативы продолжайте создавать строку, пока не распознаете «DISCE», обозначающий конец этой передачи.

Однако проблема заключается в том, что, по моему опыту, если это очень длинная очередь (что может произойти при наличии большого количества устройств), вы никогда не получите этот "DISCE". Я предположил, что это проблема прошивки.

Надеюсь, это поможет.

,