Nanopb - 解码失败:零标签
Posted
技术标签:
【中文标题】Nanopb - 解码失败:零标签【英文标题】:Nanopb -Decoding failed: zero tag 【发布时间】:2020-03-19 21:29:02 【问题描述】:这是我第一次在这里写,如果我做错了什么,请原谅。
我需要有关“解码失败:零标签”状态的帮助。
我想使用 ESP-NOW 发送数组 这是我的编码方面:
epostavke.baterija[0]=razina_baterije[0];
postavke.baterija[1]=razina_baterije[1];
postavke.baterija[2]=razina_baterije[2];
postavke.baterija[03]=razina_baterije[3];
postavke.baterija[4]=razina_baterije[4];
postavke.baterija[5]=razina_baterije[5];
pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
pb_encode(&stream, Postavke_fields, &postavke);
esp_now_send(NULL, (uint8_t *) &buffer, sizeof(buffer));
在我打印时编码后:
Serial.println(postavke.baterija[0]);
Serial.println(postavke.baterija[1]);
它向我显示了正确的值 - 所以这意味着 postavke.baterija[0] 具有类似 postavke.baterija[1] 的值,例如它向我显示 87 ,85 它取决于。
但问题是当我想解码它时。它告诉我:“解码失败:零标签” 下面是代码:
enter cod stream = pb_istream_from_buffer(buffer,sizeof(buffer));
bool status = pb_decode(&stream, Postavke_fields, &postavke);
if (!status)
printf("Decoding failed: %s\n", PB_GET_ERROR(&stream));
return ;
Serial.println("Stigli podaci, a oni glase: ");
Serial.println(postavke.znak);
Serial.println(postavke.vrijeme_trajanja);
Serial.println(postavke.vrijeme_odmora);
Serial.println(postavke.boja1);
Serial.println(postavke.boja2);
Serial.println(postavke.boja3);
Serial.println(postavke.broj_signala);
Serial.println(postavke.timer);
Serial.println(postavke.multicaster);
Serial.println(postavke.broj_propustenih);
Serial.println(postavke.random_odmor);
Serial.println(postavke.baterija[0]);
Serial.println(postavke.baterija[1]);
如果我不使用这个
`
if (!status)
printf("Decoding failed: %s\n", PB_GET_ERROR(&stream));
return ;
它解码所有其他内容,但不解码“postavke.baterija”数组
这是我在 .proto 文件中的做法
message Postavke
required int32 ID=1;
required int32 znak=2;
required int32 vrijeme_trajanja=3;
required int32 vrijeme_odmora=4;
required int32 boja1=5;
required int32 boja2=6;
required int32 boja3=7;
required int32 broj_signala=8;
required int32 timer=9;
required int32 multicaster=10;
required int32 broj_propustenih=11;
required int32 random_odmor=12;
required int32 svjetlina=13;
repeated int32 baterija=14 ;
这是我的 .options 文件
Postavke.baterija max_count:6;
Postavke.baterija max_size:6;
请帮帮我!! 错在哪里?为什么不想解码?
谢谢!
【问题讨论】:
【参考方案1】:pb_istream_from_buffer(buffer,sizeof(buffer));
您需要传递消息的实际长度,而不是缓冲区的整个长度。
现在 nanopb 正在读取超过消息长度,并且显然达到零标记号,这在协议缓冲区中无效。
【讨论】:
以上是关于Nanopb - 解码失败:零标签的主要内容,如果未能解决你的问题,请参考以下文章