Я использую Nanopb, чтобы попытаться отправить сообщения protobuf из VixWorks National Instruments Compact RIO (9025). Моя кросс-компиляция отлично работает, и я могу даже отправить полное сообщение с типами данных, которые не требуют дополнительной кодировки. То, что получает меня, - это обратные вызовы. Мой код перекрестно скомпилирован и вызывается из LabVIEW, и структура Nanopb на основе обратного вызова, похоже, прерывается (ошибка, авария, целевые перезагрузки и т. Д.) На целевой машине. Если я запускаю его без каких-либо обратных вызовов, он отлично работает.Nanopb без обратных вызовов
Вот код в вопросе:
bool encode_string(pb_ostream_t *stream, const pb_field_t *field, void * const *arg)
{
char *str = "Woo hoo!";
if (!pb_encode_tag_for_field(stream, field))
return false;
return pb_encode_string(stream, (uint8_t*)str, strlen(str));
}
extern "C" uint16_t getPacket(uint8_t* packet)
{
uint8_t buffer[256];
uint16_t packetSize;
ExampleMsg msg = {};
pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
msg.name.funcs.encode = &encode_string;
msg.value = 17;
msg.number = 18;
pb_encode(&stream, ExampleMsg_fields, &msg);
packetSize = stream.bytes_written;
memcpy(packet, buffer, 256);
return packetSize;
}
А вот файл прото:
syntax = "proto2"
message ExampleMsg {
required int32 value = 1;
required int32 number = 2;
required string name = 3;
}
Я попытался сделать обратный вызов экстерном «C», а также, и это не изменить что-нибудь. Я также попытался добавить файл опций nanopb с максимальной длиной и либо не понял его правильно, либо он тоже не работал.
Если я удаляю строку из протокола proto и удаляю обратный вызов, он отлично работает. Похоже, что структура обратного вызова не будет работать в этой библиотечной среде LabVIEW -> C. Есть ли другой способ кодировать сообщение без структуры обратного вызова? Или каким-то образом встроить обратный вызов в функцию getPacket()?
Обновленный код:
extern "C" uint16_t getPacket(uint8_t* packet)
{
uint8_t buffer[256];
for (unsigned int i = 0; i < 256; ++i)
buffer[i] = 0;
uint16_t packetSize;
ExampleMsg msg = {};
pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
msg.name.funcs.encode = &encode_string;
msg.value = 17;
msg.number = 18;
char name[] = "Woo hoo!";
strncpy(msg.name, name, strlen(name));
pb_encode(&stream, ExampleMsg_fields, &msg);
packetSize = stream.bytes_written;
memcpy(packet, buffer, sizeof(buffer));
return packetSize;
}
Обновлено прото файл:
syntax = "proto2"
import "nanopb.proto";
message ExampleMsg {
required int32 value = 1;
required int32 number = 2;
required string name = 3 [(nanopb).max_size = 40];
}
Я думал, что я попытался с помощью MAX_SIZE, но, возможно, не сделали это правильно и попробуйте еще раз , Я определенно попробовал добавить extern «C» к обратному вызову, и это не помогло. Я не дошел до вывода последовательной консоли, но попробую это сделать. Благодаря! –
Итак, я попытался добавить параметр в поле в своем прото-файле, и генератор выплевывает: Опция «(nanopb)» неизвестна. Мысли? –
@ChuckClaunch Вы должны добавить 'import 'nanopb.proto"; 'вверху: http://koti.kapsi.fi/jpa/nanopb/docs/reference.html#defining-the-options-in-the-op- proto-file – jpa