首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nanopb编码总是大小为0(但没有编码失败)

nanopb编码总是大小为0(但没有编码失败)
EN

Stack Overflow用户
提问于 2019-06-19 14:52:10
回答 1查看 295关注 0票数 0

我有一个非常简单的原型:

代码语言:javascript
复制
syntax = "proto2";

message TestMessage {
    optional int32 val = 1;
    optional string msg = 2;  // I set max size to 40 in options, so TestMessage_size is defined.
}

我在...and程序的主循环中有以下代码:

代码语言:javascript
复制
  TestMessage test_msg = TestMessage_init_zero;
  test_msg.val = 123;

  // Print message length.
  size_t msg_length;
  bool get_msg_length = pb_get_encoded_size(&msg_length, TestMessage_fields, &test_msg);
  Serial.println(msg_length);

  // Encode and print message.
  uint8_t testbuffer[TestMessage_size];
  pb_ostream_t teststream = pb_ostream_from_buffer(testbuffer, sizeof(testbuffer));
  bool teststatus = pb_encode(&teststream, TestMessage_fields, &test_msg);
  if (!teststatus) {
    Serial.println("Failed to encode test message.");
    return;
  }
  Serial.print("Message: ");
  Serial.println(teststream.bytes_written);
  for(size_t i = 0; i < teststream.bytes_written; i++){
    Serial.print(testbuffer[i], OCT);
  }
  Serial.println("testbuffer flushed");

由于某些原因,我可以打印test_msg.val,它将显示123,但当我尝试对其进行编码时(如this one),它总是为空/大小为0。

这是nanopb的配置问题吗?我想知道encode方法是否需要一些我没有使用的东西?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-19 17:50:35

对于可选字段,还必须设置has_field

代码语言:javascript
复制
TestMessage test_msg = TestMessage_init_zero;
test_msg.has_val = true;
test_msg.val = 123;

这是因为,否则将无法知道是否设置了可选字段。C++通过setter方法来处理这个问题,但是C没有这样的方法。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56661663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档