[英]Encoding NanoPB variable Strings
我有一個在運行時通過從 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,&eeprom_buffer_length);
apn_msg.domain.arg = &eeprom_buffer;
apn_msg.domain.funcs.encode = &encode_string;
read_or_load_defaults_buffer(APN_UNAME_BASE,eeprom_buffer,&eeprom_buffer_length);
apn_msg.username.arg = "nuts";
apn_msg.username.funcs.encode = &encode_string;
問題是“nuts”正在被編碼,但eeprom_buffer
中的變量值沒有被編碼。 我需要一些關於為什么會發生這種情況的建議,好嗎?
這是我的encode_string
function:
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));
read_or_load_defaults_buffer(APN_CONFIG_BASE,eeprom_buffer,&eeprom_buffer_length); apn_msg.domain.arg = &eeprom_buffer; apn_msg.domain.funcs.encode = &encode_string; read_or_load_defaults_buffer(APN_UNAME_BASE,eeprom_buffer,&eeprom_buffer_length);
第一個問題可能是代碼將arg
設置為&eeprom_buffer
。 根據它被聲明為什么類型,代碼可能應該像它一樣將eeprom_buffer
傳遞給另一個 function。
第二個問題是pb_encode
在調用eeprom_buffer
之前似乎被重用於其他數據。 因此,當回調最終被調用時,它只會看到eeprom_buffer
中的最新數據。
我建議改為在回調 function 本身中讀取 EEPROM:
bool encode_from_eeprom(pb_ostream_t* stream, const pb_field_t* field, void* const* arg) { char eeprom_buffer[128]; size_t eeprom_buffer_len; int address = (int)(*arg); read_or_load_defaults_buffer(address,eeprom_buffer,&eeprom_buffer_len); if (!pb_encode_tag_for_field(stream, field)) return false; return pb_encode_string(stream, eeprom_buffer, eeprom_buffer_len); } ... apn_msg.domain.arg = (void*)APN_CONFIG_BASE; apn_msg.domain.funcs.encode = &encode_from_eeprom;
這樣就不需要將字符串存儲在 RAM 中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.