0

这个问题是关于 8 个传出通道红外发射器的固件。它是一个带有 8 个 IR LED 的微控制器板。目标是让发射器能够使用一个或多个通道发送数据流。数据通过 UART 传送到电路板,然后通过一个或多个通道传输。

我的发射器电路比 UART 快,所以不需要流量控制。

目前我在固件中固定了通道,所以来自 UART 的每个字节都是直接传输的。这意味着无法通过 UART 设置所需的通道,这正是我想要的。

当然,最简单的解决方案是在数据字节中附加一个控制字节,其中每一位代表一个通道。这样做的好处是每个字节都可以路由到一个或多个通道,但当然会大大增加开销。

由于传输的流类型,我试图避免在我的发射器中使用长度字段。

我的研究工作是在此之上的网络堆栈中。

我的问题是是否有解决此问题的方案或良好做法。我预计机器人技术中也会出现类似的问题,其中传感器数据流一直在交叉控制信号,但我找不到简单而优雅的解决方案。

4

2 回答 2

1

似乎唯一明智的解决方案是为 UART 数据创建一个载体协议。无论如何,你可能想要这个,因为 UART 对 EMI 的免疫力很差。您可以通过在协议中包含 CRC 检查来使其更可靠。(请注意,自 70 年代中期左右以来,通过启动/停止/奇偶校验对 UART 的内置错误处理非常幼稚且非常过时。)

通常,这些协议类似于<sync token> <header> <data> <checksum>,其中标头可能包含数据长度,然后数据可以是可变长度的。

在这一点上可能不是一个选项,但 SPI 会是一个更令人愉快的接口来处理这个问题。然后,您可以每 8 个 IR 二极管有一个移位寄存器,并通过一些 MUX/DEMUX 电路通过 SPI 从设备选择通道。一切都将同步工作,不需要运营商协议。它将完全消除数据发送器和二极管之间对 MCU 的需求。

于 2014-11-27T07:54:09.813 回答
1

我的项目中一般使用SLIP传输协议。它非常快速,易于实现,并且可以很好地构建您想要的任何数据包。

http://www.tcpipguide.com/free/t_SerialLineInternetProtocolSLIP.htm https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=slip%20protocol

基本上,您将要发送或接收的每个字节都输入到一个使用 0xC0 作为页眉和页脚的函数中。由于 0xC0 是您可以发送的数据包中的有效字节,因此对 0xC0 的数据字节进行了一些转换,以保证 0xC0 仅是页眉和页脚。

然后在另一边使用反向算法,您可以将传入的数据框起来并以正确的顺序查找 0xC0 两次。这表示一个完整的数据包,可以缓冲并标记用于主 cpu 处理。

SLIP 将保证数据包的正确成帧。

然后由您来定义您自己的数据包格式,该格式存在于 SLIP 数据包内的数据字段已正确构建数据包。

我经常做以下...

<0xC0> ...<0xC0>

为您的不同频道使用不同的操作码。如果需要,您可以轻松地添加另一个带有致谢的图层。

于 2014-12-04T16:42:59.430 回答