@peacock
HTML/CSS, JS, PHP, JAVA, C#, Ubuntu

Почему я не могу обработать ответ сервера?

Добрый день!
Мне необходимо на дисплей LCD 1602 выводить ответ сервера. Использую Arduino Nano, шилд ENC28J60 (библиотека EtherCard от 09.2014).

Ответ от сервера получаю через функцию tcpReply: const char* reply = ether.tcpReply(session);
Вывести reply с заголовками в монитор порта получается, но дальше преобразовать в строку для поиска JSON данных не представляется возможным.

Нашёл похожий пример: на гитхабе - там на 123 строке жёстко указан тип данных. Сделал также, но результата нет, даже в монитор порта не выводит приведённые данные. К сожалению, в языке С++ я слабоват на предмет работы с указателями. Читал информацию о том, что нужно преобразовать в цикле, при этом производя проверку на '/0', что является концом строки...

Ниже представлен фрагмент моего кода:
const char* reply = ether.tcpReply(session);
  if (reply != 0) {
    String data;
    for (int i = 0; reply[i] != '\0'; i++) {
     data += reply[i];
    }
    Serial.println(data);
  }


В мониторе порта данные обрезаны. Что я делаю неправильно? Как преобразовать тип const char* в String?
В Интернете полно примеров, но никто не обрабатывает данные, полученные от сервера.
  • Вопрос задан
  • 183 просмотра
Пригласить эксперта
Ответы на вопрос 3
myjcom
@myjcom Куратор тега C++
попробуйте так:
const char* data;
while((data = ether.tcpReply()) != NULL)
{
  Serial.println(static_cast<String>(data));
}
Ответ написан
@res2001
Developer, ex-admin
Никогда не работал с ардуино и с этой библиотекой, но принципы везде одни и те же.
1.Обычно, когда получаете данные по сети, то получаете не строку с завершающим нулем, а байтовый массив с длинной. Уточните в документации, что именно возвращает tcpReply().
2.При передаче данных по сети нет гарантии, что вы получите за один вызов функции чтения всю переданную информацию. Обычно либо передают в начале размер последующих данных, либо данные должны заканчиваться определенным значением и чтение из потока производится до получения этого значения.

Если tcpReply() возвращает строку с завершающим нулем, то преобразовать ее в String можно просто передав ее в конструктор:
String data(reply);
Ответ написан
Комментировать
@vanyamba-electronics
В примерах копируется так:
data = data + reply[i];
Может быть дело в этом. А может банально переполняется стек.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы