nanopb 编码总是大小为 0(但没有编码失败)
nanopb encode always size 0 (but no encode failure)
我有一个非常简单的原型:
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
但是当我尝试对其进行编码时(下面的例子如 this one)它总是空的/大小为 0 .
这是 nanopb 的配置问题吗?我想知道编码方法是否需要我没有使用的东西?
对于可选字段,您还必须设置 has_field
:
TestMessage test_msg = TestMessage_init_zero;
test_msg.has_val = true;
test_msg.val = 123;
那是因为否则无法知道可选字段是否已设置。 C++ 通过 setter 方法处理这个问题,但 C 没有这些方法。
我有一个非常简单的原型:
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
但是当我尝试对其进行编码时(下面的例子如 this one)它总是空的/大小为 0 .
这是 nanopb 的配置问题吗?我想知道编码方法是否需要我没有使用的东西?
对于可选字段,您还必须设置 has_field
:
TestMessage test_msg = TestMessage_init_zero;
test_msg.has_val = true;
test_msg.val = 123;
那是因为否则无法知道可选字段是否已设置。 C++ 通过 setter 方法处理这个问题,但 C 没有这些方法。