2013-07-31 16 views
0

我们有一个定制的微控制器卡(ST32/ARM Cortex M3),它有一个摄像头。相机以1280x1024分辨率捕捉10位灰度。我们需要通过串行将图像数据发送回PC主机。这是相当大的数据;假设一切正常,在115200波特传输将是3分钟。任何我为确保鲁棒性而执行的操作似乎都会减慢进程速度(例如,拆分成块,校验和块,如果发生损坏则要求重新发送)。所以想知道人们如何在速度和诚信之间做出妥协。用于发送图像数据的串行协议

我们目前正在看到约6分钟的实际转换时间。我们必须将UART波特率设置为一个奇怪的值 - 1036800 - 因为在115200时出现了问题(PC运行在115200)。我比硬件更软件,所以任何想法为什么可能发生会有所帮助!

+0

您的波特率计算结果偏离了9倍。也许您有一个72 MHz的部件,它使用8 MHz时钟的x9 PLL,并且基于假设PLL为活动的,但实际上在没有PLL的情况下运行(或至少计时外设),比计算所假设的慢9倍。或者,也许你有一个预分频器在外设时钟 –

回答

5

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

运行长度编码或增量编码可以减少要发送的数据。

有很多更好的算法,如TIFF,但您可能想要在TIFF的缓冲区中更换复杂的TIFF,以便在嵌入式一侧使用更简单的软件。

然后你可以为你的压缩数据提供一些简单的Xmodem。

这也是作为标准协议的有用特性。

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

+0

有效。数据是10位灰度,所以很明显,我可以立即将这些位打包,立即节省10/16。但是随后我增加了数据的熵,所以RLE根本不会表现的很好。将需要进行实验,看看是否只是打包,只是做RLE,或者两者都能改善事情。 –

4

Tim Williscroft关于压缩数据的答案是一个不错的第一步。

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

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

要做的第一件事是看看时间在哪里: 用示波器观察你的UART信号。正如你所说的,转移需要两倍的理论时间,你不应该看到连续的信号。没有硬件流量控制,STM32需要时间来输出数据。通过硬件流量控制,还可以查看流量​​控制信号以确定哪一侧导致暂停(可能都是)。