我正在使用Python并安装了最新版本的NI-VISA。我正在使用ctypes包来加载与NI-VISA一起安装的visa32.dll。
我使用了NI-VISA文档以及the following page作为我的代码的基础。
我已经知道pyVisa包装器并使用他们的find_resources函数确实返回连接的仪器。但是,我不想使用这个包装器,而是宁愿直接使用VISA DLL文件。
我也一直在浏览pyVisa代码,看看他们是如何做到的,并试图从中学习,但似乎我仍然没有得到它。
这是我目前尚未完成的代码:
import sys
from ctypes import *
visa = windll.LoadLibrary("visa32.dll")
resourceManagerHandle = c_int(0)
visa.viOpenDefaultRM(byref(resourceManagerHandle))
instr_list = c_ulong(0)
nb = c_ulong(0)
desc = create_string_buffer(128)
print(visa.viFindRsrc(resourceManagerHandle,
"?*INSTR",
byref(instr_list),
byref(nb),
byref(desc)))
# The previous line prints: -1073807343
print(instr_list)
# The previous line prints: c_ulong(0)
我一直试图在互联网上找到错误代码-1073807343(十六进制4000FFEF)的含义,虽然我在National Instruments论坛上找到了一些关于它的论坛帖子,但我还是不太明白什么这意味着。
我欢迎任何有关相关信息的建议,指导或链接。
答案 0 :(得分:1)
文字"?*INSTR"
创建一个str
对象,它在Python 3中是Unicode .ctypes将unicode字符串转换为wchar_t *
。在Windows上,wchar_t
是2个字节,因此ctypes将指针传递给UTF-16编码缓冲区"?\x00*\x00I\x00N\x00S\x00T\x00R\x00"
。请记住,该函数需要一个以null结尾的字符串。
要传递字节字符串,请在文字前加b
以创建bytes
对象,即使用b"?*INSTR"
。
为了防止这样的错误被忽视,请定义函数指针argtypes
。如果为定义为ArgumentError
的参数传递了unicode str
参数,则ctypes将引发c_char_p
。
from ctypes import *
visa = WinDLL("visa32.dll") # or windll.visa32
def vi_status_check(vi_status, func, args):
if vi_status < 0:
raise RuntimeError(hex(vi_status + 2**32))
return args
visa.viOpenDefaultRM.errcheck = vi_status_check
visa.viOpenDefaultRM.argtypes = [POINTER(c_uint32)]
visa.viFindRsrc.errcheck = vi_status_check
visa.viFindRsrc.argtypes = [c_uint32, # sesn
c_char_p, # expr
POINTER(c_uint32), # findList
POINTER(c_uint32), # retcnt
c_char_p] # desc
rm_session = c_uint32()
visa.viOpenDefaultRM(byref(rm_session))
expr = b"?*INSTR"
instr_list = c_uint32()
nb = c_uint32()
desc = create_string_buffer(256)
visa.viFindRsrc(rm_session,
expr,
byref(instr_list),
byref(nb),
desc)
{5}在第5-30页上说instrDesc
应该至少为256个字节。