如何解决NanoPB 帮助!编码嵌套的重复项,但不确定我是否正确定义了架构
我正在定义电池组的故障。 包由一个或多个模块组成。 模块由6个Cell组成。
我已经能够得到包信息减去重复的模块。我相信我重复的模块现在正在编码但出现错误:
Decoding failed: parent stream too short
目前我的原型是这样的
syntax = "proto2";
package TeslaBMS;
message Pack {
required int32 numberOfModules = 2;
required float currentVoltage = 3;
required float averagePacktemp = 4;
repeated Module modules = 5;
message Module {
required int32 id = 1;
required float moduleVoltage = 2;
required float moduleTemp = 3;
required float lowestCellVolt = 4;
required float highestCellVolt = 5;
// repeated Cell cells = 6;
// message Cell{
// required int32 cellId = 1;
// required float cellVolt = 2;
// required string balanceState = 3;
// }
}
}
产生这些结构定义
/* Struct definitions */
typedef struct _TeslaBMS_Pack {
int32_t numberOfModules;
float currentVoltage;
float averagePacktemp;
pb_callback_t modules;
} TeslaBMS_Pack;
typedef struct _TeslaBMS_Pack_Module {
int32_t id;
float moduleVoltage;
float moduleTemp;
float lowestCellVolt;
float highestCellVolt;
} TeslaBMS_Pack_Module;
我创建了一个 typedef 结构来保存一个模块数组
typedef struct{
TeslaBMS_Pack_Module modarr[MAX_MODULE_ADDR];
int listSize = 0;
}
ModuleList;
这些是一些构建模块数组的辅助函数
modulelist_add_module
用于解码,module_array_maker
用于编码
以下是我根据我能找到的示例进行编码/解码的内容。
编码:
void encoder(){
// Setup pack message
TeslaBMS_Pack mypack = TeslaBMS_Pack_init_zero;
// stream to write buffer
pb_ostream_t stream = pb_ostream_from_buffer(buffer,sizeof(buffer));
// set deffinitions
mypack.averagePacktemp = bms.getAvgTemperature();
mypack.currentVoltage = bms.getPackVoltage();
mypack.numberOfModules = bms.getNumOfModules();
ModuleList modArr;
module_array_maker(&modArr);
// set the arg to data needed
mypack.modules.arg = &modArr;
// encode the modules
mypack.modules.funcs.encode = modules_encode;
//encode the pack
status = pb_encode(&stream,TeslaBMS_Pack_fields,&mypack);
message_length = stream.bytes_written;
if (!status) printf("Encoding failed: %s\n",PB_GET_ERROR(&stream));
}
为重复模块字段编码回调
bool modules_encode(pb_ostream_t *stream,const pb_field_iter_t *field,void * const *arg)
{
ModuleList *source = (ModuleList*)(*arg);
for(int i=0; i<bms.getNumOfModules();i++)
{
printf(" \n Mod %i is at %f \n",(int)source->modarr[i].id,source->modarr[i].moduleVoltage);
if (!pb_encode_tag_for_field(stream,field))
{
const char * error = PB_GET_ERROR(stream);
printf("encode_modules error: %s",error);
return false;
}
if (!(stream,TeslaBMS_Pack_Module_fields,&source->modarr[i]))
{
const char * error = PB_GET_ERROR(stream);
printf("SimpleMessage_encode_numbers error: %s",error);
return false;
}
}
return true;
}
解码:
void decode(){
/* Allocate space for the decoded message. */
TeslaBMS_Pack myPack = TeslaBMS_Pack_init_zero;
/* Create a stream that reads from the buffer. */
ModuleList modArr;
module_array_maker(&modArr);
myPack.modules.arg = &modArr;
myPack.modules.funcs.decode = modules_decode;
pb_istream_t stream = pb_istream_from_buffer(buffer,message_length);
/* Now we are ready to decode the message. */
status = pb_decode(&stream,&myPack);
/* Check for errors... */
if (!status)
{
printf("Decoding failed: %s\n",PB_GET_ERROR(&stream));
}
else
{
/* Print the data contained in the message. */
printf("\n********MESSAGE FROM NANOPB!*********\n");
// printf("Number Of Modules in Pack: ",myPack.numberOfModules);
printf("Pack Voltage: %.3f\n",myPack.currentVoltage);
printf("Average Temp: %.3f\n",myPack.averagePacktemp);
printf("Number of modules: %i\n",(int)myPack.numberOfModules);
for (size_t i = 0; i < myPack.numberOfModules ; i++)
{
printf("\n ************ Module %i ************\n",modArr.modarr[i].id);
printf(" Voltage: %.3f Temperature: %.3f \n",modArr.modarr[i].moduleVoltage,modArr.modarr[i].moduleTemp);
}
printf("********MESSAGE FROM NANOPB!*********\n");
}
}
模块的解码回调
bool modules_decode(pb_istream_t *istream,const pb_field_t *field,void **arg){
ModuleList * dest = (ModuleList*)(*arg);
TeslaBMS_Pack_Module module;
if(!pb_decode(istream,&module)){
const char * error = PB_GET_ERROR(istream);
printf("module_decode error: %s",error);
return false;
}
modulelist_add_module(dest,module);
return true;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。