2017-11-11 90 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