1

我有一个在运行时通过从 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功能:

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));
4

1 回答 1

0
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像传递给其他函数一样传递。

第二个问题是在被调用eeprom_buffer之前似乎被重用于其他数据。pb_encode因此,当回调最终被调用时,它只会看到eeprom_buffer.


我建议改为在回调函数本身中读取 EEPROM:

bool encode_from_eeprom(pb_ostream_t* 流,const pb_field_t* 字段,void* const* arg)
{
 字符 eeprom_buffer[128];
 size_t eeprom_buffer_len;
 整数地址 = (int)(*arg);

 read_or_load_defaults_buffer(地址,eeprom_buffer,&eeprom_buffer_len);

 如果(!pb_encode_tag_for_field(流,字段))
    返回假;

 返回 pb_encode_string(流,eeprom_buffer,eeprom_buffer_len);
}

...

apn_msg.domain.arg = (void*)APN_CONFIG_BASE;
apn_msg.domain.funcs.encode = &encode_from_eeprom;

这样就不需要将字符串存储在 RAM 中。

于 2021-12-05T06:56:23.940 回答