Nanopb -Декодирование не выполнено: нулевой тег - PullRequest
0 голосов
/ 20 марта 2020

Я впервые пишу здесь, так что извините, если я что-то сделал неправильно.

Мне нужна помощь с состоянием "Ошибка декодирования: нулевой тег".

Я хочу отправить массив, используя 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] имеет значение как поставка.батерия [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 Ответ

0 голосов
/ 20 марта 2020
pb_istream_from_buffer(buffer,sizeof(buffer));

Вам нужно передать фактическую длину вашего сообщения вместо всей длины буфера.

Теперь nanopb читает после длины сообщения и, по-видимому, достигает нулевого номера тега, который недопустимо в буферах протокола.

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