Чтение строки из Firebase и сохранение ее в виде CString

У меня есть мобильное приложение (сделанное с помощью MIT App Inventor), хранящее некоторые значения в базе данных Firebase. App inventor хранит все значения в виде строк (т.Е. в кавычках, а строки имеют кавычки, заключенные в кавычки, например "\"hello\"").

Я использую эту библиотеку для извлечения данных из Firebase в ESP8266. Я использую String var для хранения полученного значения, а затем изменяю его на CString (попытка сохранить его напрямую не работает), как показано ниже:

Это не работает:

Firebase.get(firebaseData, "/SCHEDULE DETAILS/SCHEDULE1/FREQ FR");
Serial.print("node -- schedule1 /FREQ FR -- type: ");   
Serial.println(firebaseData.dataType());
char * cstr1 = new char [33];
cstr1 = firebaseData.stringData(); 
Serial.print(" -- data: ");
Serial.println(cstr1);  

Это работает:

Firebase.get(firebaseData, "/SCHEDULE DETAILS/SCHEDULE1/WEIGHT");
Serial.print("node -- schedule1/WEIGHT -- type: ");   
Serial.println(firebaseData.dataType() ) ; 
String dummy = firebaseData.stringData();
Serial.print(" -- data: ");
Serial.print(dummy); 
char * cstr = new char [dummy.length()+1];
strcpy (cstr, dummy.c_str()); 
Serial.print(" -- data int type: ");
Serial.println(atoi(cstr)) ; 

У меня есть еще несколько узлов для получения данных, и я читал, что большое количество строк - плохая практика. Пытаясь узнать больше, я увидел исходный код, и сама функция StringData возвращает CString:

Я чувствую, что делаю на один шаг больше, чем требуется! Любые предложения о том, как это сделать, были бы очень полезны!

Try1 Основываясь на ответе @Majenko, я попробовал это перед добавлением в библиотеку:

const char* get_cstring() {
  String str = "will it work" ; 
  return str.c_str();
}

void setup() {
  Serial.begin(9600);
}

void loop() {
  const char *new_c = get_cstring(); 
  int len = strlen(new_c);

  for (int i = 0; i < len; i++) {
    Serial.println(new_c[i]);  
    delay(1000);
  }
  Serial.println("----------");
}

Но как мне получить доступ к содержимому, потому что он просто печатает значения мусора; strlen(new_c) дает 2 (я предполагаю, что это объем памяти, необходимый в байтах !?)

Спасибо!

, 👍-1

Обсуждение

Не могли бы вы опубликовать решение, чтобы другие могли воспользоваться., @mariano proietti


1 ответ


Лучший ответ:

0

Возвращая строковый объект, Firebase сначала генерирует этот строковый объект и копирует в него строковые данные C.

Если вы хотите получить необработанные строковые данные C, вам придется добавить новый "геттер" в библиотеку, чтобы вернуть указатель на эти строковые данные C:

Я бы написал это для вас, но поскольку вы опубликовали скриншот функции Firebase, и изменение этого кода на новый код очень незначительно (просто измените имя функции и тип возвращаемого значения), я не могу скопировать и вставить его. И я не собираюсь всматриваться в это маленькое изображение и набирать его снова.

Кстати, внутренне библиотека Firebase фактически использует std::string, что является лучшей реализацией того же, что и String . String был создан потому, что компилятор Arduino не имеет STL и, следовательно, не имеет std::string. В любом случае они оба используют динамическое распределение.

,

Проблема в том, что ваша переменная str является локальной для функции. Он и выделенная в нем память уничтожаются при возврате функции. Итак, то, что у вас есть в "new_c", - это указатель ни на что особенное. Этого не должно быть в случае Firebase, поскольку _data - это "std::string", которая является переменной-членом, а не локальной переменной., @Majenko

Я попробовал с глобальным String var; это работает! Но когда я пытаюсь использовать new_c.atoi() с целочисленным значением в качестве входных данных, он терпит неудачу; так как же должен быть объявлен возвращаемый тип!? или где должны быть внесены изменения для выполнения этих преобразований типов !?, @Somasundharam Sampath

@SomasundharamSampath Используйте atoi (new_c), @Majenko

это было очень глупо с моей стороны!!! Большое спасибо! Похоже , мне нужен еще один букварь по Си ., @Somasundharam Sampath