Как получить полный ответ json SIM900 + Arduino?

json
  void toSerial(int delay_ms)
  {
    delay(delay_ms);

    while(mySerial.available()) 
    {
       Serial.write(mySerial.read());
    }
  }

  Serial.begin(9600);
  mySerial.begin(9600);

  mySerial.println("AT+HTTPINIT"); 
  toSerial(500);

  mySerial.println("AT+HTTPPARA=\"CID\", 1"); 
  toSerial(500);

  mySerial.println("AT+HTTPPARA=\"URL\", \"www.example.test\"");
  toSerial(500);

  mySerial.println("AT+HTTPPARA=\"CONTENT\", \"application/json\"");
  toSerial(500);

  mySerial.println("AT+HTTPACTION=0"); 
  toSerial(4000);

  mySerial.println("AT+HTTPREAD");
  delay(3000);

  while(mySerial.available()) 
  {
    Serial.write(mySerial.read());
  }

  Serial.println("");
  mySerial.println("AT+HTTPTERM"); 
  toSerial(500);

Результат:

AT+HTTPREAD

+HTTPREAD:39
{"pinRed":0,"pinGreen":1,"pinYello

Я ожидаю сообщений:

{"pinRed":0,"pinGreen":1,"pinYellow":0}

, 👍2

Обсуждение

Просто чтение последовательных данных происходит намного быстрее, чем они поступают. Таким образом, вы считываете все из буфера и очищаете его, чтобы available возвращал ноль до того, как все туда попадет. Вы можете проверить, что available дает вам достаточно большое число, чтобы вы знали, что все сообщение есть, прежде чем начать читать, или вы можете проанализировать свое сообщение, чтобы увидеть, все ли оно есть, прежде чем двигаться дальше. Если бы вы вернулись позже и прочитали еще немного о следующем цикле, вы бы увидели ":0} перед следующим сообщением. Он появился только после того, как ты перестал читать., @Delta_G

эй, как ты наконец добрался? не могли бы вы опубликовать окончательный код? Я уже несколько дней отчаиваюсь в деталях. Я был бы очень благодарен! Привет из Германии, @Severin Baumgartner


1 ответ


1

Ладно, я нашел решение. Для начала вам нужно загрузить длину ответа сервера и выполнить цикл в соответствии с длиной ответа.

,