2011-02-25 40 views
3

我正在使用python(Pydev)與使用ctypes的DLL進行步進電機通信。我正試圖找回電機的位置。問題是,如果我通過線在控制檯輸入行腳本它的工作原理,但如果我運行該腳本,它總是給我0 這是我的代碼:無法從Python腳本中的C函數中檢索值,但可以在控制檯中使用

import ctypes 

AC=windll.hvpositionerv2 
adr=addressof 
class PositionerInfo (Structure): 
    _fields_=[("id",c_int),("locked",c_bool)] 

ptr=POINTER(PositionerInfo)() 
devCount=AC.PositionerCheck(adr(ptr)) 
print("Devices found: "+repr(devCount)) 
for i in range(min(adr(ptr),devCount)): 
    print("ID: "+repr(ptr[i].id)+" Locked? "+repr(ptr[i].locked)) 

handle=POINTER(c_int)() 
AC.PositionerConnect(0,adr(handle)) 

到目前爲止,該計劃已僅連接到設備。現在,問題是這樣的:

ypos=c_int() 
AC.PositionerGetPosition(handle,1,adr(ypos) 

print(ypos.value) 

這總是打印0如果我運行腳本(在Eclipse中),但在控制檯中工作。

+0

你是否嘗試過在eclipse之外運行這個?這可能是它在eclipse中運行時找不到所需的DLL,並且代碼碰巧仍然運行並打印0?否則,這可能是一個時間問題。 – 2011-02-25 16:24:43

+0

可能是命名空間衝突,dll與python模塊的名稱相同,該模塊在pythons路徑中首先列出? – 2011-02-25 19:43:51

+0

什麼是C函數原型?另外,要通過引用傳遞,可以使用'handle = c_int()',然後在函數參數中使用'byref(handle)'。 range()發生了什麼?爲什麼選擇adr(ptr)和devCount的最小值? – 2011-02-26 03:47:01

回答

0

我最好猜測:這是一個計時問題。連接到硬件後,需要一段時間才能報告電機位置,在第一個響應之前,您將始終得到0.嘗試在AC.PositionerGetPosition之前添加1秒的睡眠時間。

相關問題