【问题标题】:Serial protocol for sending image data发送图像数据的串行协议
【发布时间】:2013-07-31 17:53:21
【问题描述】:

我们有一个定制的微控制器卡(ST32 / ARM Cortex M3),它连接了一个摄像头。相机以 1280x1024 分辨率捕捉 10 位灰度。我们需要通过串行将该图像数据发送回 PC 主机。这是相当大的数据块;假设一切顺利,在 115200 波特传输将是 3 分钟。我为确保稳健性而实施的任何操作似乎都会减慢该过程(例如,拆分为块,校验和块,如果损坏则要求重新发送)。所以想知道人们如何在速度和完整性之间做出良好的折衷。

我们目前看到的实际传输时间约为 6 分钟。我们不得不将 UART 波特率设置为一个奇怪的值 - 1036800 - 因为在 115200 存在问题(PC 在 115200 运行)。我更多的是软件而不是硬件,所以任何关于为什么会发生这种情况的想法都会有所帮助!

【问题讨论】:

  • 您的波特率计算偏离了 9 倍。也许您有一个使用 8 MHz 时钟的 x9 PLL 的 72 MHz 部件,并且您的计算中的常数基于假设 PLL 处于活动状态,但实际上在没有 PLL 的情况下运行(或至少为外设提供时钟),比您的计算假设慢 9 倍。或者,也许您在外设时钟上激活了预分频器

标签: serial-port embedded


【解决方案1】:

首先对图像进行一些简单的压缩。

无论是游程编码还是增量编码,发送的数据都会更少。

有更好的算法,例如 TIFF,但您可能需要权衡 TIFF 处理缓冲区的复杂性,以便在嵌入式端使用更简单的软件。

然后,您可以为压缩数据买得起 Xmodem 之类的简单设备。

这也具有作为标准协议的有用属性。

这可能会导致您使用终端+xmodem 传输样式接口到您的主机。 这也将使调试界面变得非常简单。

【讨论】:

  • 有趣。数据是 10 位灰度的,所以很明显我可以立即打包这些位以立即节省 10/16。但是后来我增加了数据的熵,所以 RLE 根本不会表现得很好。需要进行试验,看看是否只是打包、只是做 RLE,或两者都可以改善。
【解决方案2】:

Tim Williscroft 关于压缩数据的回答是很好的第一步。

现在从串行协议方面来看,实际传输速率很大程度上取决于双方如何配置和实施软件。波特率不是唯一需要关心的:

  • 您是否使用硬件流控制?如果使用硬件流控制,您将能够显着提高波特率 (x10) 而不会产生溢出错误。
  • 从STM32你是使用DMA、中断甚至值得轮询的方法来管理数据传输吗?我不知道您使用的确切 STM32 参考,但在我使用的 STM32 上,UART 传输 FIFO 被限制为 1 个字节。因此,如果您遇到性能问题,则只能使用 DMA。
  • 仍然从 STM32 方面来看,您可以极大地提高性能,同时注意应用程序正在执行的总线访问(以及可能的冲突仲裁)。
  • 此外,在 STM32 上,所有时钟都是可配置的。使用外部高速振荡器(如果板上有)可能是提高内部 RC 振荡器性能的好方法。还要注意内部总线时钟配置!
  • 现在从 PC 端来看,性能可能会受到影响,具体取决于您的应用程序如何缓冲和处理接收到的数据。

首先要做的是查看时间花在哪里: 用示波器观察您的 UART 信号。正如您所说,传输时间是理论时间的两倍,您不应该看到连续信号。如果没有硬件流控制,则需要时间来输出数据的是 STM32。使用硬件流量控制,还要查看流量控制信号来确定哪一方导致暂停(可能两者都有)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多