1

我目前正在通过 UART 在我的 PC 和 ARM M4 微控制器之间发送数据。我已经定义了自己的协议,其中每条消息如下所示:
[ START_CHAR LEN TYPE SEQ DATA CRC]
START_CHAR 和 LEN 字段帮助我确定数据何时结束,之后我查找 TYPE(恒定偏移量 3)以确定哪些数据按顺序排列将其解压缩到消息类中。

现在我正在研究 flatbuffers,它看起来很完美,除了我不能将 TYPE 编码到消息中而不将其包含在实际消息中。这是我正在尝试做的事情:

namespace FlatMessage;

uint8 const TYPE = 50; // does not compile

table String {
  value:string;
}

root_type String;

我可以创建一个枚举,但这很混乱。谢谢!

[编辑] 我应该补充一点,我可以将协议更改为拥有一个,但出于遗留原因END_CHAR,我需要支持该领域。TYPE

好吧,实际上,我想我仍然需要该类型来弄清楚如何将其反序列化为平面缓冲区。

例如

  uint8_t *buf = builder.GetBufferPointer(); // I can do this with END_CHAR because I could get the buffer.

  auto receive_string = GetString(buf); // But I wouldn't know what the type is. e.g. this could be GetCoolString(buf).
4

1 回答 1

1

您有几个选项可以使用 FlatBuffer 存储类型:

  • 自己为缓冲区添加类型前缀。
  • 利用file_identifierFlatBuffers 的特性,可以识别 FlatBuffer 的类型。
  • 使用联合类型将类型存储在 FlatBuffers 本身中。使根表有一个联合字段。
于 2017-10-23T04:26:59.540 回答