首页 > 解决方案 > 将数据从 C 缓冲区传输到 Python,以便在 Visual Studio 2019 中使用 Matplotlib 进行绘图

问题描述

我有 C 代码在 Visual Studio 2019 中成功运行,它用来自 FPGA 的实时数据填充缓冲区。它被宣布为...

无符号字符 *pBuffer;

...在 C 中。我可以在 pBuffer 的地址处的内存监视窗口中看到数据是正确的。

我还在 Visual Studio 中安装了 Python 3.7,并使用 Python 数组中的 python.h 成功地使用 Matplotlib 进行绘图。

所以我的问题是如何将数据从 C 缓冲区传输到 python 数组进行绘图?

我看过 ctypes 并且因为我的主要代码是在 C 中,所以从 C 转到 Python 然后再次调用 C 没有多大意义。我看过 bytes()、bytearray() 和 memoryview()。Memoryview 对我很有吸引力,因为它不复制数据,而且这种绘图需要非常快,因为数据进来的速度非常快。(想想示波器)但它似乎不是它使用的真实物理地址,而是某种与我的数据所在的任何内存位置都不对应的标识符。我只是想绘制我知道存在于特定地址的 C 缓冲区(一维数组)中的数据。Python 似乎非常严格。

我似乎无法做我想做的事,因为 Python 显然不允许从某个特定的内存位置读取数据。在这种情况下,我想知道它如何检查内存以以任何方式显示内容,更不用说将内容传输到 Python 数组了。这是怎么做到的?是的,我是 Pythonic 新手。感谢您的任何帮助或建议。

标签: pythoncmatplotlib

解决方案


我的第一个想法是在文件中传递数据。matplotlib它将为交换增加几毫秒,但在加载 Python 解释器和模块后甚至可能察觉不到。

如果您需要更即时的响应,则本地环回网络连接可能会很有用。这在 C 端比在 Python 端更麻烦,尤其是在 Windows 上。

至于直接从记忆中读取,你是对的。标准 Python 不会这样做。您可以使用基于 C 的模块从 C 主程序中执行您现在正在执行的任何操作,以从 FPGA 中获取数据。如果都是 Windows API 的股票,您可能想看看 Mark Hammond 的PyWin32模块。可以使用pip install pywin32提升的命令提示符从 Python 包索引安装它。它可能支持您需要的 API。如果是这样,那么您可能不需要单独的 C 程序来获取数据。

PS:进程间通信的另一个选项是命名管道。Windows 命名管道可以用 PyWin32 打开。请参阅此 SO question的最高投票答案。


推荐阅读