我正在尝试使用API控制Tektronix RSA306频谱分析仪。程序找到RSA300API.dll文件,但在搜索和连接到设备时会引发错误。我正在运行的程序是Tektronix的一个例子。我目前使用的设置是64位Windows 7上的Python 2.7.12 x64(Anaconda 4.1.1)。
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
我遇到的问题是找不到“搜索”功能。这个问题的解决方案是什么?
答案 0 :(得分:0)
Tektronix应用工程师。
这里的问题是API版本不匹配。您的代码引用旧版本的API(RSA300API.dll),错误消息引用了较新版本的API(RSA_API.dll)。确保您已安装最新版本的API,并在代码中引用了正确的dll。
以下链接可下载最新版本的RSA API(截至11/1/16): http://www.tek.com/model/rsa306-software
以下是下载API文档的链接(截至11/1/16)。本文档附有一个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()