Буфер char в String в Arduino UNO

String getAPIData()
{
  char res_buffer[450];
  int numdata = inet.httpGET("myserver.com", 80, "/call.php?id=1&q=1&code=1001", res_buffer, 450);
  String result = String(res_buffer);
  Serial.println(result);
  Serial.println(numdata);
  return result;
}

Вывод по серийному номеру:

15:52:07.208 -> 
15:52:07.208 -> 393

Но когда я печатаю буфер по циклу, я получаю следующий результат:

HTTP/1.1 200 OK
Date: Mon, 16 Sep 2019 06:28:59 GMT
Server: Apache
X-Powered-By: PHP/7.2.20
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Set-Cookie: PHPSESSID=5b21eeac22dcf61f2e4d2efd579d437c; path=/
Upgrade: h2,h2c
Connection: Upgrade, close
Vary: Accept-Encoding,User-Agent
Content-Type: text/html; charset=UTF-8

-1

Я не уверен, почему буфер символов не преобразуется в строку в Arduino UNO.

Есть известные проблемы? Предложите, если требуется какое-либо исправление.

, 👍2

Обсуждение

Не используйте строку. Это не подходит для цели. Нет причин когда-либо использовать String., @Majenko

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


1 ответ


2

Не используйте строку. И особенно не используйте String так, как вы его используете.

Подробнее о том, почему нет, можно прочитать здесь.

Вместо этого используйте только буферы char*.

Правильный способ сделать то, что вы хотите, — определить буфер вне вашей функции, а затем передать этот буфер функции для заполнения:

int getAPIData(char *buf, int maxlen) {
  return inet.httpGET("myserver.com", 80, "/call.php?id=1&q=1&code=1001", buf, maxlen);
}

Затем вы вызываете его с помощью:

char *my_buffer[450];
getAPIData(my_buffer, 450);
Serial.println(my_buffer);
,