Arduino получает данные от программного обеспечения серийного - PullRequest
0 голосов
/ 08 ноября 2018

Извините за мой слабый английский. Я пытаюсь получить данные 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 ]

0 голосов
/ 09 ноября 2018

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

 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 
0 голосов
/ 08 ноября 2018

для запуска попробуйте:

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

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

...