簡體   English   中英

編碼 NanoPB 變量字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM