Я предполагаю, что 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. Все, что вам нужно, это передать разные токены, чтобы достичь разных точек строки и достичь желаемого значения.