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

Serial port 用于发送图像数据的串行协议,serial-port,embedded,Serial Port,Embedded,我们有一个定制的微控制器卡(ST32/ARM Cortex M3),它连接了一个摄像头。相机以1280x1024分辨率捕获10位灰度。我们需要通过串口将图像数据发送回PC主机。这是一个相当大的数据块;假设一切正常,115200波特的传输时间为3分钟。我为确保健壮性而实现的任何东西似乎都会减慢这一过程(例如分割成块,对块进行校验和,如果损坏则要求重新发送)。所以我想知道人们如何在速度和正直之间做出一个很好的妥协 我们目前看到的实际转移时间约为6分钟。我们不得不将UART波特率设置为一个奇怪的值—1

我们有一个定制的微控制器卡(ST32/ARM Cortex M3),它连接了一个摄像头。相机以1280x1024分辨率捕获10位灰度。我们需要通过串口将图像数据发送回PC主机。这是一个相当大的数据块;假设一切正常,115200波特的传输时间为3分钟。我为确保健壮性而实现的任何东西似乎都会减慢这一过程(例如分割成块,对块进行校验和,如果损坏则要求重新发送)。所以我想知道人们如何在速度和正直之间做出一个很好的妥协


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

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

运行长度编码或增量编码都会减少要发送的数据

有很多更好的算法,比如TIFF,但您可能想在缓冲区TIFF的复杂性之间进行权衡,以在嵌入式端使用更简单的软件

然后,您就可以为压缩数据提供一些简单的东西,比如Xmodem

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

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

蒂姆·威利斯克罗夫特关于压缩数据的回答是一个很好的第一步

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

  • 您正在使用硬件流控制吗?如果使用硬件流控制,您将能够显著提高波特率(x10),而不会产生超限错误
  • 在STM32中,您是否使用DMA、中断或甚至值得轮询的方法来管理数据传输?我不知道您使用的确切STM32参考,但在我使用的STM32上,UART传输FIFO限制为1字节。因此,如果您有性能问题,您只能使用DMA
  • 尽管如此,从STM32方面来看,您仍然可以在应用程序正在进行的总线访问(以及可能的冲突仲裁)上大大提高性能
  • 此外,在STM32上,所有时钟都是可配置的。使用外部高速振荡器(如果船上有)可能是比内部RC振荡器提高性能的好方法。还要注意内部总线时钟配置
  • 现在从PC端看,性能可能会受到影响,具体取决于应用程序如何缓冲和处理接收到的数据
要做的第一件事是看看时间花在哪里:
用示波器观察UART信号。正如你所说的,传输时间是理论时间的两倍,你不应该看到连续的信号。如果没有硬件流控制,则需要时间输出数据的是STM32。对于硬件流量控制,还要查看流量控制信号,以确定哪一侧导致暂停(可能两者都有)。

有趣。数据是10位灰度,所以很明显,我可以立即打包这些位,以便立即保存10/16。但是我增加了数据的熵,所以RLE的性能根本就不好。您需要进行实验,看看是否只是打包,只是做RLE,或者两者都能改善情况。您的波特率计算被关闭了9倍。也许您有一个72 MHz的部件,它使用8 MHz时钟的x9 PLL,并且在您的计算中有常数,基于PLL处于活动状态的假设,但在没有PLL的情况下实际运行(或至少为外围设备计时),比您的计算假设慢9倍。或者外围时钟上有一个激活的预分频器