Функция считывания rfid возвращает null

У меня есть функция, которая считывает rfid-карту и возвращает rfid-строку. Функция хорошо читает строку, но. Я использую ArduinoJson libray для генерации json.

это функция, которую я использую для считывания rfid-карт.

String rfidOku(){
  String kartid= "";
  if( mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()){
    for (byte i = 0; i < mfrc522.uid.size; i++) 
    {
        kartid.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
        kartid.concat(String(mfrc522.uid.uidByte[i], HEX));
    }
    kartid.toUpperCase();
    //Serial.println(kartid); 
  }
  kartid.trim();
  return kartid;
}

и в функции цикла, если кнопка нажата, я получаю rfid, и я создаю json, используя его

    const size_t capacity = JSON_OBJECT_SIZE(4);
    DynamicJsonDocument doc(capacity);
    const String str_rfid = rfidOku();              
    doc["id"] = odeme.id;
    doc["fiyat"] = odeme.fiyat;
    doc["rfid"] = str_rfid;

    serializeJson(doc, Serial);  

Когда я смотрю на последовательный монитор, поле rfid равно нулю. Почему это происходит. Я попытался написать там другую строку, она хорошо работает с другой строкой, но почему она не работает с str_rfid. Я также печатаю значение str_rfid, используя Serial.print str_rfid, получая идентификатор rfid-карты из функции хорошо.

, 👍2

Обсуждение

Ваша функция создает локальную переменную и возвращает ее значение в конце функции, локальная переменная выйдет из области видимости при выходе из функции и больше не будет доступна. Кроме того, String object использует динамическое выделение памяти в куче и освобождается, когда она выходит за пределы области видимости. Прочитайте книгу о программировании на C ++ и постарайтесь не использовать String object, если вы новичок в программировании на Arduino / C ++., @hcheung

@hcheung сэр, как это можно исправить, что я должен сделать, чтобы решить эту проблему., @Enver Pasha

@hcheung: функция возвращает строку, и это возвращаемое значение используется и присутствует в соответствии с OP. Переменная scope не имеет к этому никакого отношения., @ocrdu

@ocrdu функция работает и возвращает строку, я вывожу ее с помощью последовательной печати. Это правильно. Но когда я присваиваю его doc["rfid"], в выводе json поле имеет значение null. Я создал строку для проверки строки a = "example", я присваиваю ее doc["rfid"] , в json я показываю это значение, оно хорошо работает с другими строками., @Enver Pasha

@Enver-Pasha: Возможно, емкость вашего объекта JSON слишком мала из-за дублирования строк при десериализации для его печати. Вы могли бы попробовать емкость типа JSON_OBJECT_SIZE(3) + 500 для десериализации, просто для тестирования. Взгляните на https://arduinojson.org/v5/assistant / для большего. Также смотрите https://arduinojson.org/v6/how-to/determine-the-capacity-of-the-jsondocument / . Не уверен, что это проблема, но попробовать стоит. Также: вы могли бы попробовать: doc["rfid"] = str_rfid.c_str(); чтобы посмотреть, работает ли это лучше (CString вместо String object)., @ocrdu

@ocrdu, сэр, вам так понравилось, что это сработало., @Enver Pasha

Какой из них сработал?, @ocrdu

@ocrdu Второй, doc["rfid"] = str_rfid.c_str(); это сработало., @Enver Pasha

Так что, возможно, ArduinoJson плохо работает со строковыми объектами, или есть какая-то другая причина, о которой я не знаю. Я напишу ответ, основанный на моем комментарии; пожалуйста, примите его (если вы принимаете его 8-)., @ocrdu


1 ответ


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

0

Возможно, емкость вашего объекта JSON слишком мала из-за дублирования строк, когда вы десериализуете его для печати.

Вы должны попробовать емкость типа JSON_OBJECT_SIZE(3) + 500 для десериализации и посмотреть, что произойдет.

Кроме того, попробуйте: doc["rfid"] = str_rfid.c_str(); чтобы увидеть, работает ли это лучше (CString вместо String object).

Более подробную информацию о вместимости объекта можно найти здесь, здесь есть калькулятор.

,