问题描述
我正在定义电池组的故障。 包由一个或多个模块组成。 模块由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 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 (将#修改为@)