Кодирование строк переменных NanoPB

#c #embedded #nanopb

#c #встроенный #нанопб

Вопрос:

У меня есть строка, которая определяется во время выполнения путем чтения из EEPROM:

 pb_ostream_t config_params_apn = pb_ostream_from_buffer(buffer_arr, buffer_arr_size);   read_or_load_defaults_buffer(APN_CONFIG_BASE,eeprom_buffer,amp;eeprom_buffer_length);   apn_msg.domain.arg = amp;eeprom_buffer;  apn_msg.domain.funcs.encode = amp;encode_string;  read_or_load_defaults_buffer(APN_UNAME_BASE,eeprom_buffer,amp;eeprom_buffer_length);  apn_msg.username.arg = "nuts";  apn_msg.username.funcs.encode = amp;encode_string;  

Проблема в том, что «орехи» кодируются, но значение переменной в eeprom_buffer нет. Мне нужен совет о том, почему это может произойти, пожалуйста?

Вот моя encode_string функция:

 bool encode_string(pb_ostream_t* stream, const pb_field_t* field, void* const* arg)   char* str = (char*)(*arg);  if (!pb_encode_tag_for_field(stream, field))  return false;  return pb_encode_string(stream, (uint8_t*)str, strlen(str));  

Ответ №1:

 read_or_load_defaults_buffer(APN_CONFIG_BASE,eeprom_buffer и длина eeprom_buffer_length);  apn_msg.domain.arg = amp;eeprom_buffer;  apn_msg.домен.функции.кодирование = amp;строка кодирования;  read_or_load_defaults_buffer(APN_UNAME_BASE,eeprom_buffer,amp;eeprom_buffer_length);

Первая проблема, вероятно, заключается в том, что код настроен arg на amp;eeprom_buffer . В зависимости от того, какого типа он объявлен, код, вероятно, должен передаваться eeprom_buffer так же, как и другой функции.

Вторая проблема заключается в том, что eeprom_buffer данные, которые, по-видимому, ранее повторно использовались для других данных, pb_encode вызываются. Поэтому, когда обратный вызов в конечном итоге будет вызван, он будет видеть только последние данные eeprom_buffer .


Я бы предложил вместо этого выполнить считывание EEPROM в самой функции обратного вызова:

bool encode_from_eeprom(pb_ostream_t* поток, постоянное поле pb_field_t*, пустота* const* arg) {  символ eeprom_buffer[128];  size_t eeprom_buffer_len;  int адрес = (int)(*arg);   read_or_load_defaults_buffer(адрес,eeprom_buffer и eeprom_buffer_len);   если (!pb_encode_tag_for_field(поток, поле))  возвращает false;   возвращает строку pb_encode_string(поток, eeprom_buffer, eeprom_buffer_len); }  ...  apn_msg.домен.arg = (пустота*)APN_CONFIG_BASE; apn_msg.домен.функции.кодировать = amp;кодировать из_прома;

Таким образом, нет необходимости хранить строку в оперативной памяти дольше, чем это необходимо.