2017-11-11 60 views
0

我有一个C代码(传感器的SDK),当我运行它时,它通过USB启动与传感器的连接,然后用回调监听传感器输出并打印它(我也写在一个文本文件)。在回调中每打印一个样本50毫秒。从python运行C代码并听取变量值

现在我想从Python运行这个C代码(因为我需要在python中实时分析数据),并且每当C中的回调函数产生一个新的输出(一个16 * 1的整数数组)时,我需要将它们传递给python代码。

我见过几种运行C代码的方法,例如Swig,但是我认为在调用C代码时使用了这些方法,并且获得了它们的返回值。 但在我的情况下,C代码处于无限循环,并且不会在主代码中返回任何内容。我也没有这个选项来从传感器中逐一读取样本,因为每次运行C代码时,我都应该通过USB连接到传感器,然后能够读取值,连接到传感器需要时间,我不能这样做每时每刻。

这是我用来连接到传感器和读取值的SDK(C代码)。 https://www.dropbox.com/s/s5rrrdy4mzrv54f/Main.c?dl=0

我不是软件工程师,所以我可能不擅长事先编码。 任何人都可以帮助我吗?

谢谢。

+0

您可能会研究开发一个[自定义C模块](https://docs.python。 org/2/extensions/extensions.html) – jedwards

+0

看看'ctypes'。恕我直言,甚至回调是可能的。 – harandk

+0

看看Cython。 –

回答

1

你可以用ctypes或其他绑定代码对Python进行“回调”,但这意味着你的Python代码会阻碍你的C代码 - 无论何时你运行Python代码,你都不检查值来自传感器。

有时候,简单会更好:您可以将您的值写入文件,您可以从单独的Python进程中懒懒地读取文件。

如果你不想让文件增长,你可以使用命名管道,如果你在Unix上。或者也许只是使用redis将值放入队列中。否则,只需将相关的PythonAPI代码添加到您的C程序中,以便您可以使用Python multiprocessing.Queue对象并将您的值放在那里,然后使用多处理来启动进程来运行您的C代码。

https://docs.python.org/3/library/multiprocessing.html#pipes-and-queues

这需要你的C代码写入,以便它是可调用的Python和获取队列作为参数。那么,您的C代码可以集中传感器,而Python端则会消耗这些值。我的第一个建议对于你来说只是最简单的事情 - 使用NamedPipe和一个单独的Python程序来处理这些值。在C上你只需要创建命名管道,在那里它将记录读取数据的文件发送到http://www.tldp.org/LDP/lpg/node15.html