这个问题是关于8个输出通道红外发射器的固件。它是一个带有 8 个红外 LED 的微控制器板。目标是拥有一个能够使用一个或多个通道发送数据流的发射器。数据通过UART传送到电路板,然后通过一个或多个通道传输。
我的变送器电路比UART快,所以不需要流量控制。
目前,我在固件中固定了通道,因此来自UART的每个字节都是直接传输的。这意味着无法通过UART设置所需的通道,而这正是我想要的。
当然,最简单的解决方案是在数据字节后附加一个控制字节,其中每个位代表一个通道。这样做的好处是每个字节都可以路由到一个或多个通道,但当然会大大增加开销。
由于传输的流类型,我试图避免发射器中的长度字段。
我的研究工作是在此之上的网络堆栈中。
我的问题是是否有计划或良好做法来解决这个问题。我预计机器人技术中也有类似的问题,其中传感器数据流一直在交叉控制信号,但我找不到简单而优雅的解决方案。
我通常在项目中使用 SLIP 传输协议。 它非常快速,易于实现,并且可以很好地构建您想要的任何数据包。
http://www.tcpipguide.com/free/t_SerialLineInternetProtocolSLIP.htmhttps://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>
对不同的通道使用不同的操作码。 如果需要,您可以轻松添加另一个带有确认的图层。
似乎唯一明智的解决方案是为UART数据创建载波协议。无论如何,您可能想要这个,因为UART对EMI的抗扰度很差。您可以通过在协议中包含CRC检查来使其更可靠。(请注意,自 70 年代中期左右以来,通过启动/停止/奇偶校验对 UART 的内置错误处理非常幼稚且已经过时。
通常这些协议类似于<sync token> <header> <data> <checksum>
,其中标头可能包含数据长度,然后数据可以是可变长度。
在这一点上可能不是一个选择,但 SPI 将是一个更令人愉快的界面。然后,您可以为每个 8 个 IR 二极管设置一个移位寄存器,并通过某个 MUX/DEMUX 电路通过 SPI 从机选择选择通道。一切都将同步工作,不需要载波协议。它将完全消除数据发送器和二极管之间对MCU的需求。