0

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

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

4

2 回答 2

5

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

运行长度编码或增量编码都会为您提供更少的数据发送。

有更好的算法,如 TIFF,但您可能希望权衡 TIFF 缓冲区的复杂性,以获得更简单的嵌入式软件。

然后你就可以为你的压缩数据买得起像 Xmodem 这样简单的东西了。

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

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

于 2013-07-31T09:37:25.813 回答
4

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

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

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

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

于 2013-08-01T10:24:11.610 回答