【问题标题】:Store value in variable after HTTPREAD在 HTTPREAD 之后将值存储在变量中
【发布时间】:2017-09-05 19:46:23
【问题描述】:

我正在使用 GSM SIM900 和 Arduino Uno。我正在为 SIM900 使用 AT 命令。我成功地从 GET 请求中获取数据并显示在串行监视器上,但是在 AT+HTTPREAD 命令之后,我想将数据存储到变量中。我怎样才能做到这一点?我正在从 Web 服务器获取 JSON 对象,我想从该对象获取 Status 属性并将其保存到变量中。

#include <SoftwareSerial.h>
SoftwareSerial gprsSerial(2,3);

void setup() {
  gprsSerial.begin(9600);
  Serial.begin(9600);
  Serial.println("Con");
  delay(2000);
  Serial.println("Done!...");
  gprsSerial.flush();
  Serial.flush();
  // See if the SIM900 is ready
  gprsSerial.println("AT");
  delay(1000);
  toSerial();
  // SIM card inserted and unlocked?
  gprsSerial.println("AT+CPIN?");
  delay(1000);
  toSerial();
  // Is the SIM card registered?
  gprsSerial.println("AT+CREG?");
  delay(1000);
  toSerial();
  // Is GPRS attached?
  gprsSerial.println("AT+CGATT?");
  delay(1000);
  toSerial();
  // Check signal strength
  gprsSerial.println("AT+CSQ ");
  delay(1000);
  toSerial();
  // Set connection type to GPRS
  gprsSerial.println("AT+SAPBR=3,1,\"Contype\",\"GPRS\"");
  delay(2000);
  toSerial();
  // Set the APN
  gprsSerial.println("AT+SAPBR=3,1,\"APN\",\"wap.mobilinkworld.com\"");
  delay(2000);
  toSerial();
  // Enable GPRS
  gprsSerial.println("AT+SAPBR=1,1");
  delay(10000);
  toSerial();
  // Check to see if connection is correct and get your IP address
  gprsSerial.println("AT+SAPBR=2,1");
  delay(2000);
  toSerial();
}

void loop() {
  // initialize http service
  gprsSerial.println("AT+HTTPINIT");
  delay(2000); 
  toSerial();
  // set http param value
  // ToDO : send dynamic value
  gprsSerial.println("AT+HTTPPARA=\"URL\",\"http://smockfyp.azurewebsites.net/api/Device/GetStatus?did=1\"");
  delay(4000);
  toSerial();
  // set http action type 0 = GET, 1 = POST, 2 = HEAD
  gprsSerial.println("AT+HTTPACTION=0");
  delay(6000);
  toSerial();
  // read server response
  gprsSerial.println("AT+HTTPREAD");
  delay(1000);
  toSerial();
  gprsSerial.println("AT+HTTPTERM");
  toSerial();
  delay(300);
  gprsSerial.println("");
  delay(10000);
}

void toSerial() {
  while(gprsSerial.available()!=0) {
    Serial.write(gprsSerial.read());
  }
}

这是我想存储在变量中的输出:

AT+HTTPINIT

OK
AT+HTTPPARA="URL","http://smockfyp.azurewebsites.net/api/DeviceAT+HTTPACTION=0

OK

+HTTPACTION: 0,200,17
AT+HTTPREAD

+HTTPREAD: 17
[{"Status":true}]
OK

【问题讨论】:

  • 我想你想将[{"Status ":true}] 存储到一个变量中。
  • 感谢您验证我的回答。如果您认为,答案应该对未来的 SO 成员有所帮助,也可以更好地为答案投票。

标签: arduino http-get gsm at-command sim900


【解决方案1】:

先买一张大的A3纸,找支红笔写1000遍

我永远不会使用delay 来代替读取解析来自调制解调器的响应。

我永远不会使用delay 来代替读取解析来自调制解调器的响应。

我永远不会使用delay 来代替读取解析来自调制解调器的响应。

我绝不会使用delay 来代替读取解析来自调制解调器的响应。

我永远不会使用delay 来代替读取解析来自调制解调器的响应。

...

然后阅读this answer按照有关 V.250 的说明进行操作。当您正确消化了答案中的所有信息后(可能需要一些时间才能让所有信息都融入其中),然后点击下方评论中的链接指向另一个答案(其中包含捕获响应内容的信息)。


当然第一部分是为了搞笑,但我对其余部分非常认真;您必须填补一些巨大的 AT 命令知识“漏洞”。在您这样做之前,您将无法获得任何信息。这应该不是很困难,但需要一些努力。

【讨论】:

    【解决方案2】:

    首先你应该初始化一个名为a的char数组来存储值,并声明一个变量int flag=0;

    然后修改你的toSerial()函数如下:

    void toSerial() {
      while(gprsSerial.available()!=0) {
        if( gprsSerial.read() == '[' )
          flag=2;
        else if(flag == 2 && gprsSerial.read() == ':')
          while(gprsSerial.read() != '}') {
            a[i]= gprsSerial.read();
            i++;
          }
        else if(flag == 0)
          Serial.write(gprsSerial.read());
        else
          flag--;
      }
    }
    

    【讨论】:

    • 这会将值truefalse 存储到数组a。请尝试并告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多