Arduino получает данные из серийного программного обеспечения

Извините за мой слабый английский. Я пытаюсь получить данные JSON от Sim800 на моем Arduino. Для чтения данных по последовательному порту я использовал следующий код:

while(serialSIM800.available()==0); //Wait until the data is received
    String content = "";
  while(serialSIM800.available()>0){ // When data is received
    content = content + char(char (serialSIM800.read()));
    }
Serial.print(content);

Но неполные данные получены. Следующее:

{"id":"1212","temp":"24","hum","4

Для лучшего результата я использовал следующий код:

 byte x;
char data[128];
void sim800Reply() {
  x=0;
  do{   
    while(serialSIM800.available()==0);
    data[x]=serialSIM800.read();
    Serial.print(data[x]);
    x++;
  } while(!(data[x-1]=='K'&&data[x-2]=='O'));
}

Данные полностью получены. Следующее:

{"id":"1212","temp":"24","hum","45","date":"11.2018","status":"200"}

OK

Но я думаю, что этот код не является хорошим и есть проблемы. Например, если serialSIM800 недоступен, например, когда sim800 не подключены, следующий код вызывает сбой while(serialSIM800.available()==0); Потому что это всегда верно ИЛИ Если есть ошибка и OK Не был получен, следующий код вызывает сбой while(!(data[x-1]=='K'&&data[x-2]=='O')); Поскольку это всегда так. Максимальная длина данных составляет 120 байтов. Что мне следует сделать, чтобы получить данные Json от серийного Arduino? Спасибо вам всем.

2 ответа

Для начала попробуй:

if (serialSIM800.available()) {
  String content = serialSIM800.readString();
  Serial.print(content);
}

в настройках () добавить serialSIM800.setTimeut(50);

Наконец, я изменил код следующим образом:

 String dump(bool printData) {
      byte while_cunt = 0;
      while (serialSIM800.available() == 0){
        while_cunt++;
        delay(15); // It can change for a proper delay
        if(while_cunt >=250){  // If the data from serial was not received past 3.75 seconds
          Serial.println("return");
          return "";   // Exit from dump function
        }
      }
      String content = "";
      while (serialSIM800.available() > 0) {
        content += serialSIM800.readString();
      }

      if (printData) {
        Serial.println(content);
      }
      return content;
    }

Он может возвращать и печатать последовательные данные, и он работает быстро, потому что каждые 15 миллисекунд проверяет, что данные были получены и если они не были получены в течение определенного периода времени (в данном случае 3,75 секунды), они будут вне процесса и не потерпит крах. Примеры для этой функции:

     serialSIM800.println("AT");
     dump(true); 
// print Received response from sim800

    serialSIM800.println("AT");
    String str =  dump(true); 
    // print Received response from sim800 and Saved in variable named 'str'

    serialSIM800.println("AT");
     String str =  dump(false); 
//Save response  in variable named 'str' without print 
Другие вопросы по тегам