2016-09-07 50 views
0

我想通過使用API​​來控制泰克RSA306頻譜分析儀。該程序找到RSA300API.dll文件,但在搜索並連接到設備時會引發錯誤。我正在運行的程序是Tektronix的一個例子。我目前使用的設置是Python的2.7.12 64(蟒蛇4.1.1)在64位Windows 7Python AttributeError:function'Search'not found

from ctypes import * 
import numpy as np 
import matplotlib.pyplot as plt 

我定位.dll文件用:

rsa300 = WinDLL("RSA300API.dll") 

出現的錯誤執行搜索功能時:

longArray = c_long*10 
deviceIDs = longArray() 
deviceSerial = c_wchar_p('') 
numFound = c_int(0) 
serialNum = c_char_p('') 
nomenclature = c_char_p('') 
header = IQHeader() 

rsa300.Search(byref(deviceIDs), byref(deviceSerial), byref(numFound)) 
if numFound.value == 1: 
    rsa300.Connect(deviceIDs[0]) 
else: 
    print('Unexpected number of instruments found.') 
    exit() 

運行當出現以下錯誤消息:

C:\Anaconda2\python.exe C:/Tektronix/RSA_API/lib/x64/trial 
<WinDLL 'RSA300API.dll', handle e47b0000 at 3ae4e80> 
Traceback (most recent call last): 
    File "C:/Tektronix/RSA_API/lib/x64/trial", line 44, in <module> 
    rsa300.Search(byref(deviceIDs), byref(deviceSerial), byref(numFound)) 
    File "C:\Anaconda2\lib\ctypes\__init__.py", line 376, in __getattr__ 
    func = self.__getitem__(name) 
    File "C:\Anaconda2\lib\ctypes\__init__.py", line 381, in __getitem__ 
func = self._FuncPtr((name_or_ordinal, self)) 
AttributeError: function 'Search' not found 

我遇到的問題是沒有找到'搜索'功能。這個問題的解決方案是什麼?

+1

你確定你打開的dll的方式嗎?也許你應該嘗試這種方式:http://stackoverflow.com/a/3173926/5920310 你確定在dll裏面有一個'Search'函數嗎? –

+0

我會假設在dll中有一個'搜索'功能。該DLL直接從泰克網站下載,示例程序也是從那裏下載的。 @XavierC。 – Rwinder

+0

你可以提供:'dir(rsa300)'和'help(rsa300)'的輸出嗎?我會幫你的。 – richar8086

回答

0

泰克應用工程師在這裏。

這裏的問題是API版本不匹配。您的代碼引用了舊版本的API(RSA300API.dll),並且該錯誤消息引用了更新版本的API(RSA_API.dll)。確保你已經安裝了最新版本的API,並且你在代碼中引用了正確的dll。

這裏下載最新版本的RSA的API(截至16年11月1日)的鏈接: http://www.tek.com/model/rsa306-software

這裏下載API文檔的鏈接(截至16年11月1日)。本文附有Excel電子表格,其中概述了舊功能和新功能之間的區別: http://www.tek.com/spectrum-analyzer/rsa306-manual-6

爲了清晰和一致,在新版本中更改了函數名稱。舊版本的API沒有大多數函數的前綴,並且不清楚哪些函數是通過讀取函數名稱而組合在一起的。 API的新版本爲所有函數應用前綴,現在通過閱讀它的聲明來更容易地告訴給定函數在哪個功能組中。例如,舊的搜索和連接函數簡單地稱爲Search()和Connect(),而新版本的函數稱爲DEVICE_Search()和DEVICE_Connect()。

注意:我使用cdll.LoadLibrary(「RSA_API.dll」)加載dll而不是WinDLL()。

DEVICE_Search()與Search()的參數略有不同。由於參數數據類型不同,新的DEVICE_Search()函數不能像舊的Search()函數那樣與ctypes一起玩,但是我找到了一種可行的方法(請參閱下面的代碼)。

這是我在RSA控制腳本的開頭使用search_connect()函數:

from ctypes import * 
import os 

""" 
################################################################ 
C:\Tektronix\RSA306 API\lib\x64 needs to be added to the 
PATH system environment variable 
################################################################ 
""" 
os.chdir("C:\\Tektronix\\RSA_API\\lib\\x64") 
rsa = cdll.LoadLibrary("RSA_API.dll") 


"""#################CLASSES AND FUNCTIONS#################""" 
def search_connect(): 
    #search/connect variables 
    numFound = c_int(0) 
    intArray = c_int*10 
    deviceIDs = intArray() 
    #this is absolutely asinine, but it works 
    deviceSerial = c_char_p('longer than the longest serial number') 
    deviceType = c_char_p('longer than the longest device type') 
    apiVersion = c_char_p('api') 

    #get API version 
    rsa.DEVICE_GetAPIVersion(apiVersion) 
    print('API Version {}'.format(apiVersion.value)) 

    #search 
    ret = rsa.DEVICE_Search(byref(numFound), deviceIDs, 
     deviceSerial, deviceType) 

    if ret != 0: 
     print('Error in Search: ' + str(ret)) 
     exit() 
    if numFound.value < 1: 
     print('No instruments found. Exiting script.') 
     exit() 
    elif numFound.value == 1: 
     print('One device found.') 
     print('Device type: {}'.format(deviceType.value)) 
     print('Device serial number: {}'.format(deviceSerial.value)) 
     ret = rsa.DEVICE_Connect(deviceIDs[0]) 
     if ret != 0: 
      print('Error in Connect: ' + str(ret)) 
      exit() 
    else: 
     print('Unexpected number of devices found, exiting script.') 
     exit()