将NI-VISA与Python一起使用:viFindRsrc中的错误代码-1073807343

将NI-VISA与Python一起使用:viFindRsrc中的错误代码-1073807343,python,wrapper,ctypes,visa,Python,Wrapper,Ctypes,Visa,我使用Python,安装了最新版本的NI-VISA。我使用ctypes包来加载随NI-VISA一起安装的visa32.dll 我使用了NI-VISA文档以及代码的基础 我已经知道pyVisa包装器,并且使用它们的find_resources函数确实返回连接的仪器。但是,我不希望使用此包装器,而是直接使用VISA DLL文件 我也一直在浏览pyVisa代码,看看他们是如何做到的,并试图从中学习,但似乎我还是不明白 以下是我当前未完成的代码: import sys from ctypes impor

我使用Python,安装了最新版本的NI-VISA。我使用ctypes包来加载随NI-VISA一起安装的visa32.dll

我使用了NI-VISA文档以及代码的基础

我已经知道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十六进制)的含义,虽然我在国家仪器论坛上找到了一些关于它的论坛帖子,但我仍然不太明白它的意思

我欢迎任何有关相关信息的建议、指导或链接。

文本
“?*INSTR”
创建一个
str
对象,在Python 3中是Unicode。ctypes将unicode字符串转换为
wchar\u t*
。在Windows上,
wchar\u t
是2个字节,因此ctypes传递一个指向UTF-16编码缓冲区的指针
“?\x00*\x00I\x00N\x00S\x00T\x00R\x00”
。请记住,函数需要以null结尾的字符串

要传递字节字符串,请在文本前面加
b
前缀,以创建
bytes
对象,即使用
b”?*INSTR“

为了防止这样的错误被忽略,请定义函数指针的
argtypes
。如果为定义为
c\u char\p
的参数传递unicode
str
参数,则ctypes将引发
ArgumentError

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)
从ctypes导入*
visa=windell(“visa32.dll”)#或windell.visa32
def vi_状态检查(vi_状态、函数、参数):
如果vi_状态<0:
提升运行时错误(十六进制(vi_状态+2**32))
返回参数
visa.viOpenDefaultRM.errcheck=vi_状态_检查
visa.viOpenDefaultRM.argtypes=[指针(c_uint32)]
visa.viFindRsrc.errcheck=vi_状态_检查
visa.viFindRsrc.argtypes=[c_uint32,#sesn
c#u char#p,#expr
指针(c#uint32),#findList
指针(c#u uint32),#retcnt
c_char_p]#描述
rm_session=c_uint32()
visa.viOpenDefaultRM(byref(rm_会议))
expr=b“**仪表”
仪表清单=c_uint32()
nb=c_uint32()
desc=创建字符串缓冲区(256)
visa.viFindRsrc(rm_会议,
expr,
byref(仪表清单),
byref(nb),
描述)

第5-30页上的说明是,
instrDesc
至少应为256字节。

这个数字看起来更像一个地址或一组标志:0xBFFF0011感谢回答。是的,显然VISA对错误代码0xBFFF0011的解释是:“位置信息不足或系统中不存在设备或资源”。我会研究这一点,然后回到这条线索。