Как сохранить данные из HTTPREAD в переменную? - PullRequest
1 голос
/ 08 апреля 2020

Мне нужен способ хранить данные HTTPREAD в переменной, потому что я буду сравнивать ее значение с другой переменной. Там в любом случае?

  {
  myGsm.print("AT+HTTPPARA=\"URL\",\"http://7ae0eae2.ngrok.io/get-ignition/ccb37bd2-a59e-4e56-a7e1-68fd0d7cf845"); // Send PARA command
  myGsm.print("\"\r\n"); 
  delay(1000);
  printSerialData();

  myGsm.println();
  myGsm.println("AT+HTTPACTION=0");//submit the GET request 
  delay(8000);//the delay is important if the return datas are very large, the time required longer.
  printSerialData();
  myGsm.println("AT+HTTPREAD=0,17");// read the data from the website you access
  delay(3000);
  printSerialData();
  delay(1000);
}

void printSerialData()
{
 while(myGsm.available()!=0)
 Serial.write(myGsm.read());
}

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Я предполагаю, что Serial.write(myGsm.read()) - это , где вы хотите получить данные из . Другими словами, вы получаете данные через последовательное соединение и хотите проанализировать данные, возвращенные командой AT+HTTPREAD.

Поскольку вы не предоставили никакой подсказки о том, что эта команда возвращается в сериале, я буду использовать в качестве примера другую команду, которую я знаю, вывод, ниже:

TX=> AT+CCLK?
RX=> AT+CCLK?\n\r
     \t+CCLK: "2020/03/03, 22:00:14"\n\r

Итак, строка, которую вы собираетесь получить из вышеупомянутого * 1012 Команда * это (я назначаю указатель на символ для понимания):

char *answer = "AT+CCLK?\n\r\t+CCLK: "2020/03/03, 22:00:14"\n\r";

Вам нужно разобрать ответ (char *answer в этом примере), чтобы получить "числа" в переменные.

Как это сделать?

Вам нужно пройтись по этой строке, двигаясь к указанным c местам. Например, чтобы иметь возможность преобразовать 2020 в переменную, вы должны находиться в позиции answer[19], а затем вы можете использовать, скажем, strtoul() для преобразования в целое число и сохранения его в переменной .

uint32_t year = strtoul(&answer[19], NULL, 10);

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

uint32_t month = strtoul(&answer[24], NULL, 10);

И так далее, но вы маги c числа для этого, другими словами, числа 19 , 24 являются позициями, определяющими c для этой строки.

Тогда, как сделать эту "ходьбу" умнее?

Вы можете использовать токены вместе с strstr() до go для указания c точек, которые вы хотите в строке. В этом случае мы хотим переместить указатель на первый 2, поэтому мы можем передать этот указатель на strtoul(), чтобы преобразовать его в целое число.


#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>

int main() {
    char *answer = "AT+CCLK?\n\r\t+CCLK: "2020/03/03, 22:00:14"\n\r";
    char *token = "CCLK: \"";
    char *ptr;
    uint32_t year;

    ptr = strstr(answer, token);

    if (ptr == NULL) {
        printf("Token not found\n");
        return -1;
    }

    year = strtoul(++ptr, NULL, 10);
    printf("Year = %d\n", year);

Затем, чтобы сделать этот код в функцию, чтобы быть более обобщенной c, вот она:

    bool parse_answer_to_uint32(char *buff, char *tokens[], uint32_t *val)
    {
        char *ptr;
        int i;

        if (val == NULL)
            return false;


        for (i = 0; buff != NULL && tokens[i] != NULL; i++) {
            ptr = strstr(buff, tokens[i]);
            if (ptr == NULL)
                return false;
            buff = (ptr + strlen(tokens[i]));
        }
        // Here, you reached the point you want, based on the tokens you seek
        if (buff == NULL)
            return false;

        *val = strtoul(buff, NULL, 10);
    }

Итак, вы можете вызывать эту функцию следующим образом:

    char *tokens[] = { "CCLK: \"" };
    uint32_t year;

    if (parse_answer_to_uint32(myGsm.read().c_str(), tokens, &year) == false)
        return -1;
    printf("year is = %d\n", year);

printf напечатает 2020 на основе приведенного выше примера.

Эта функция довольно гибкая и достаточно обобщенная c. Все, что вам нужно, это передать разные токены, чтобы достичь разных точек строки и достичь желаемого значения.

0 голосов
/ 08 апреля 2020

Возьмите символьный буфер, данные Concat, поступающие из последовательного порта в этот буфер, и обработайте этот буфер для сравнения.

...