Namb 编码大小始终为 0(但没有编码失败)

  • 本文关键字:编码 失败 Namb nanopb
  • 更新时间 :
  • 英文 :


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

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.
}

。我的主循环中有以下代码用于 arduino 程序:

  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但是当我尝试对其进行编码时(按照类似此示例的示例(,它始终为空/大小为 0。

这是 nanopb 的配置问题吗?我想知道编码方法是否需要我不使用的东西?

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

TestMessage test_msg = TestMessage_init_zero;
test_msg.has_val = true;
test_msg.val = 123;

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

最新更新