gpt4 book ai didi

c - 如何解析来自MCU UART的不确定长度数据包?

转载 作者:行者123 更新时间:2023-11-30 15:14:28 26 4
gpt4 key购买 nike

我正在尝试通过以太网到串行转换器将新的微 Controller 连接到现有的 OSC(开放声音控制)网络。

OSC 消息按以下格式发送:

  • OSC 地址模式:/string/可选子字符串 --> 始终为 32 位压缩/DWORD,并在末尾与额外的 NULL 字节对齐
  • 类型标签:int32 (i)、float32 (f)、string (s)
  • 数据:对于某些模式,这是已知的长度;对于其他人来说,它的长度是不确定的

我对如何最好地划分代码以及如何缓冲它有点困惑。在我的 UART 接收 ISR 中,我希望将传入字节转储到 SRAM 缓冲区,然后在主循环中对其进行解码,但我不确定如何处理不确定长度的数据包。我从未使用过可变长度数据包,该数据包未在 header 中的某处指示数据包大小。似乎也没有任何 EOP/页脚来指示数据包的完成,并且您需要根据类型标记解码 x 个字节数。

一些担忧:1. 如何调整缓冲区大小?是的,我可以动态地执行此操作,但如果可能的话,我希望避免这种开销。这使我走向循环缓冲区,但是如何在继续解码可变长度数据包的同时在主循环中提取出我需要的内容?2. ISR 中应完成多少解码?我是否在主循环中设置某种类型的状态机,该状态机根据传入字节的 ISR 解码前进,然后在前进 FSM 时刷新这些字节?

寻找有关如何最好地解决此问题/构建代码的任何建议/指导。预先感谢您。

最佳答案

UART 接收 ISR 应该简单地读取来自 UART 的传入字节并将其复制到循环缓冲区。我不会对 ISR 中的字节进行任何解码/解析/解释。循环缓冲区应该足够大,以包含您期望接收的最大消息(如果突发消息到达的速度比主循环处理它们的速度快,则循环缓冲区应该更大)。

主循环应该使用状态机将字节流解析为消息。这些状态可以命名为 READ_ADDRESS、READ_TYPE 和 READ_DATA。或者您可能希望每种消息类型都有一个唯一的 READ_DATA 状态。

从高层角度来看,每个状态都应该从循环缓冲区读取适当数量的字节,然后前进到下一个状态。听起来数据状态处理函数必须足够智能才能计算适当的数据字节数。如果您必须解释某些数据才能计算出数据长度,那么您可能需要考虑将 READ_DATA 状态分为两种状态,一种用于读取足够的数据以计算长度,另一种用于读取其余数据。

当您设计状态处理程序函数时,请考虑循环缓冲区可能尚未接收到适当数量的字节。从低级 View 来看,当没有足够的字节可用时,状态处理程序应返回主循环。这允许主循环为应用程序的其他部分提供服务,同时 ISR 接收更多字节。然后,当主循环再次调用状态机时,状态处理程序应该从中断处继续。

关于c - 如何解析来自MCU UART的不确定长度数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34049560/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com