wrapper - Using NI-VISA with Python: error code -1073807343 in viFindRsrc -
i'm working in python , have installed lastest version of ni-visa. i'm using ctypes package in order load visa32.dll installed ni-visa.
i used both ni-visa documentation, the following page base code.
i know of pyvisa wrapper , using find_resources function return instruments connected. however, not wish use wrapper , rather use visa dll file directly.
i've been browsing pyvisa code see how it, , tried learn it, seems still don't it.
here current unfinished code:
import sys 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))) # previous line prints: -1073807343 print(instr_list) # previous line prints: c_ulong(0)
i've been trying find meaning of error code -1073807343 (4000ffef in hex) on internet , though have found forum threads on national instruments forums, still don't quite understand means.
i welcome advice, guidance or link towards relevant information.
the literal "?*instr"
creates str
object, unicode in python 3. ctypes converts unicode string wchar_t *
. on windows, wchar_t
2 bytes, ctypes passes pointer utf-16 encoded buffer "?\x00*\x00i\x00n\x00s\x00t\x00r\x00"
. bear in mind function expects null-terminated string.
to pass byte string instead, prefix literal b
create bytes
object, i.e. use b"?*instr"
.
to prevent mistake passing unnoticed, define function pointer's argtypes
. ctypes raise argumenterror
if unicode str
argument passed parameter that's defined 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)
the ni-visa programmer reference manual says on page 5-30 instrdesc
should @ least 256 bytes.
Comments
Post a Comment