#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;кодировать из_прома;
Таким образом, нет необходимости хранить строку в оперативной памяти дольше, чем это необходимо.