如何使用(UART)总线在数据流和控制之间切换

时间:2014-11-25 22:40:31

标签: c stream embedded data-stream

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

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

目前我已在固件中修复了通道,因此UART中的每个字节都直接传输。这意味着无法通过UART设置所需的通道,这就是我想要的。

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

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

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

我的问题是,是否有计划或良好做法来解决这个问题。我希望类似的问题出现在机器人技术中,传感器数据流始终跨越控制信号,但我找不到简单而优雅的解决方案。

2 个答案:

答案 0 :(得分:1)

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

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

此时可能不是一个选项,但SPI可能是一个更加愉快的界面。然后,每8个IR二极管可以有一个移位寄存器,通过某个MUX / DEMUX电路通过SPI从器件选择通道。一切都会同步工作,不需要运营商协议。它将彻底消除数据发送器和二极管之间对MCU的需求。

答案 1 :(得分: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数据包中的数据字段已正确地对数据包进行了帧处理。

我经常做以下事情......

&LT;将0xC0&GT; ...&LT;将0xC0&GT;

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