用于发送图像数据的串行协议

时间:2013-07-31 09:22:09

标签: serial-port embedded

我们有一个定制的微控制器卡(ST32 / ARM Cortex M3),它附带了一个摄像头。相机以1280x1024分辨率捕获10位灰度。我们需要通过串行将图像数据发送回PC主机。这是一大堆数据;如果一切顺利,在115200波特转移将是3分钟。我实现的任何确保健壮性的东西似乎都会减慢该过程(例如分成块,校验块,如果损坏则要求重新发送)。所以想知道人们如何在速度和诚信之间做出妥协。

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

2 个答案:

答案 0 :(得分:5)

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

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

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

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

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

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

答案 1 :(得分:4)

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

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

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

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