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