使用protobuf和STM32F7设计协议

Designing a protocol using protobuf and STM32F7

我正在尝试执行该 wiki 中定义和描述的相同协议 https://wiki.trezor.io/Developers_guide-Message_Workflows

我的工具集是用于嵌入式系统的 Protobuf:Nanopb。 STM32F7使用串口。

我现在正在尝试在 PC 和 STM32F7 之间进行通信,通常通信将在两个 STM32F7 板之间完成。

我的问题:

  1. 什么样的协议足以像trezor中的请求和应答?

  2. 我在谷歌上搜索了一下,发现我必须使用 HLDC 之类的东西,是否有必要用于此目的还是开销?

  3. 编码和设计问题:我将触发一个串行中断,该中断始终轮询两块板之间通信的数据,现在将有一个非常大的状态机来解码每种消息类型并执行基于消息类型的事件。是否有替代设计?

首先,据我所知,nanopb 不支持 Protobuf 模式语言中的全部可能性。因此,您需要一个适用于 nanopb 的模式,希望它足以满足需求。然而,它可能非常烦人,因为(据我所知)非常有用的 oneof 不起作用。

其次,protobuf wireformat 不是自定界的。因此,您将沿着串行电缆喷射数据,但不可能可靠地(如果有的话)分辨出一条消息的结束位置和另一条消息的开始位置。因此,您需要传输某种 inter-message 字节同步模式,选择不太可能在消息中遇到的字节。您必须读取同步模式之间的字节,将它们放入缓冲区,然后从中解析。

第三,如果您要发送各种不同的消息并且您不能使用 oneof,那么您将需要一些其他方法来识别到达的消息类型,以便您可以解析它到正确类型的对象。 "way" 可以只是一个固定的消息类型序列,或者一个字节,其值标识消息类型,或者一个在所有消息中做同样事情的字段。 oneof 很有吸引力(虽然你不可用),因为它可以作为各种不同消息类型的载体;您只需使用 oneof 的解析器解析接收到的数据。