кодирование nanopb всегда размером 0 (но без ошибок кодирования) - PullRequest
0 голосов
/ 19 июня 2019

У меня очень простой прото:

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 ), он всегда пуст / имеет размер 0.

Это проблема конфигурации с nanopb? Интересно, требует ли метод кодирования то, что я не использую?

1 Ответ

1 голос
/ 19 июня 2019

Для необязательных полей вы также должны установить has_field:

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

Это потому, что в противном случае невозможно узнать, было установлено дополнительное поле или нет. C ++ обрабатывает это с помощью методов установки, но в C их нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...