将数据从 C 缓冲区传输到 Python,以便在 Visual Studio 2019 中使用 Matplotlib 进行绘图

Posted

技术标签:

【中文标题】将数据从 C 缓冲区传输到 Python,以便在 Visual Studio 2019 中使用 Matplotlib 进行绘图【英文标题】:Transferring data from a C buffer to Python for plotting with Matplotlib in Visual Studio 2019 【发布时间】:2021-04-11 20:23:15 【问题描述】:

我有 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 新手。感谢您提供任何帮助或建议。

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

感谢您的回复@mike 我认为通过文件传入和传出对于我需要的东西来说太慢了。我需要以微秒或更快的速度显示数据。我会考虑你的建议,但听起来 Python 和 matplotlib 可能无法做这个简单的事情。在没有 QT 或 gnuplot 一些安装和使用复杂的图形包的情况下,我没有找到一种在 C 中严格执行此操作的方法。 @user15606644 如果这是您的想法,那“几毫秒”是用于绘制整个数据集,而不是“每点”。主要在文件打开/关闭中。我认为任何情节都需要 很多 毫秒。

以上是关于将数据从 C 缓冲区传输到 Python,以便在 Visual Studio 2019 中使用 Matplotlib 进行绘图的主要内容,如果未能解决你的问题,请参考以下文章

Python C Api 将 PyObject * 传输到 c 数组中

python Tkinter GUI 串口通信 显示。

ATS缓存数据结构

使用 event_name 列启用集群,以便将数据从 Firebase Analytics 流式传输到 Bigquery

将数据从 Google 表格流式传输到 BigQuery 以在 Tableau 中进行可视化

在tcp从python服务器传输到c#客户端期间丢失数据