在Python中使用NIVISA:viFindRs中的错误代码1073807343

2024-10-03 00:26:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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(hex中的4000FFEF),尽管我在国家仪器论坛上找到了一些关于它的论坛帖子,但我还是不太明白它的含义。在

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


Tags: 代码importvisactypes仪器listdllpyvisa
1条回答
网友
1楼 · 发布于 2024-10-03 00:26:36

文本"?*INSTR"创建一个str对象,在python3中是Unicode。ctypes将unicode字符串转换为wchar_t *。{cd4>{cd4>{cd4}是指向窗口的

要传递字节字符串,请在文本前面加上b来创建bytes对象,即使用b"?*INSTR"。在

{s>定义一个错误的函数来防止这个函数被忽略。如果为定义为c_char_p的参数传递unicodestr参数,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)

NI-VISA Programmer Reference Manual在第5-30页上说instrDesc至少应该是256字节。在

相关问题 更多 >