VISA函数

Tektronix示波器可以使用NI-VISA驱动来控制, 安装NI-VISA后, 存在/Library/Frameworks/VISA.framework,

此framework种全部是C语言接口, 查到了一些这些接口的使用和含义, 在此记录学习:

https://blog.csdn.net/yaogangganggang/article/details/103366396

https://blog.csdn.net/yu__jia/article/details/46044083


VISA函数
viOpenDefaultRM
原型    ViStatus viOpenDefaultRM (ViSession sesn );
描述    这个函数用来初始化一个VISA资源管理器,此函数必须要在其他任何VISA函数之前调用。函数通过sesn参数返回一个独立的VISA资源管理器ID。
参数    名称    方向    类型    描述
sesn    OUT    ViSession    返回一个独一无二的VISA资源管理器逻辑标识符

返回值    返回值为函数运行结果,如果成功sesn返回VISA资源管理器标识符,否则返回0。
标识符    值    描述
VI_SUCCESS    0    VISA资源管理器初始化成功。
VI_ERROR_ALLOC    系统资源不足。
VI_ERROR_INV_SETUP    配置文件无效或者不存在。
VI_ERROR_SYSTEM_ERROR    VISA系统初始化失败。

viOpen
原型    ViStatus viOpen (ViSession sesn, ViRsrc rsrcName, ViAccessMode accessMode, ViUInt32 timeout, ViSession vi);
描述    连接一个指定的设备,返回一个可用于调用其他功能的连接标识符。
参数    名称    方向    类型    描述
sesn    IN    ViSession    VISA资源管理器逻辑标识符。
rsrcName    IN    ViRsrc    地址名称。
accessMode    IN    ViAccessMode    连接打开方式,可以是以下值:
VI_EXCLUSIVE_LOCK独占方式打开;
VI_LOAD_CONFIG更具外部配置文件打开;
VI_NULL正常多访问打开。
timeout    IN    ViUInt32    如果是以独占模式连接,该参数是一个绝对时间(单位ms),超时就返回一个错误。其他连接方式忽略此值。
vi    OUT    ViSession    返回打开连接逻辑标识符。

返回值    返回值为函数运行结果,如果成功vi返回设备连接标识符,否则返回0。
标识符    值    描述
VI_SUCCESS    0    连接成功。
VI_SUCCESS_DEV_NPRESENT    连接成功。但是指定的地址无响应。
VI_WARN_CONFIG_NLOADED    指定的地址不存在或者地址格式不正确。
VI_ERROR_ALLOC    系统资源不足。
VI_ERROR_INTF_NUM_NCONFIG    指定的地址是有效的,但无法使用。
VI_ERROR_INV_ACC_MODE    非法的存取模式。
VI_ERROR_INV_RSRC_NAME    地址名称语法错误。
VI_ERROR_INV_SESSION
VI_ERROR_INV_OBJECT    无效的vi。
VI_ERROR_LIBRARY_NFOUND    VISA库加载不完全。
VI_ERROR_NSUP_OPER    资源管理器sesn不支持此函数。
VI_ERROR_RSRC_BUSY    sesn是有效的,但当前无法访问。
VI_ERROR_RSRC_LOCKED    sesn被独占。
VI_ERROR_RSRC_NFOUND    信息不足或者资源不存在。
VI_ERROR_TMO    0xBFFF0015
操作超时。

viClose
原型    ViStatus viClose(ViSession vi);
ViStatus viClose(ViEvent vi);
ViStatus viClose(ViFindList vi);
描述    关闭一个资源管理器或者设备连接,并释放内存。
参数    名称    方向    类型    描述
vi    IN    ViSession
ViEvent
ViFindList    需要关闭的对象。

返回值    返回值为函数运行结果。
标识符    值    描述
VI_SUCCESS    0    关闭成功。
VI_WARN_NULL_OBJECT    要关闭的对象是空对象。
VI_ERROR_CLOSING_FAILED    vi不能标识正当对话通道。
VI_ERROR_INV_SESSION
VI_ERROR_INV_OBJECT    无法释放与该对话通道相关联的内存数据结构。

viFindRsrc
原型    ViStatus viFindRsrc(ViSession sesn, ViString expr, ViPFindList findList,
ViPUInt32 retcnt, ViRsrc instrDesc);
描述    该函数用于查找VISA系统里与指定接口相连的资源设备。该函数查找的与expr参数相匹配的有效资源设备。
该函数成功完成将返回与exor相匹配的资源组中的第一个资源(instrDesc),还返回一个资源组中的个数(retnt)。
另外还返回一个找到的队列句柄,可以同过调用viFindNext传入这个句柄来获得其他找到的资源。当这个句柄不需要时必须调用viClose关闭。
expr参数不区分大小写,搜寻标准由两个部分组成:一个资源的正则表达式和一个可选的属性值逻辑表达式。这个正则表达式是与已知的VISA资源管理器相匹配。
如果这资源字符串与正则表达式相匹配,并且属性值也与逻辑表达式匹配,则这匹配是成功的,这资源将添加到资源查询队列(findList)中。(安捷伦的VISA不支持匹配属性值。)
这可选的属性逻辑表达式允许使用逻辑符号AND,OR,NOT。相等(==)和不等(!=)可以用与任何类型的属性比较。另外的非等号比较的(>,<,>=,<=)只能用于数值类型的属性比较。仅仅全局属性才能参与属性表达式。
如果findList参数传入的是VI_NULL,则会自动调用viClose关闭查找到的资源队列。findList参数和retcnt参数都是可选的,如果只需要第一个匹配到的设备并且不需要知道连接了多少设备这两个参数都可以传入VI_NULL。
所有返回的字符串都需要经过viParseRsrc和viOpen函数的验证,不是所有查询到的资源都可以通过和查询的。
参数    名称    方向    类型    描述
sesn    IN    ViSession    资源管理器。必须要被viOpenDefaultRM函数初始化。
expr    IN    ViString    表达要搜索的一个接口或者所有接口存在的设备。(参照下面的格式描述字符串表)
findList    OUT    ViPFindList    返回一个搜索到的句柄标识符,这句柄可以作为viFindNext函数的参数传入。如果为VI_NULL,自动动调用viClose关闭findList。
retcnt    OUT    ViPUInt32    匹配到的设备数量。如果为VI_NULL,不返回找到的个数。
instrDesc    OUT    ViRsrc    返回一个设备识别地址字符串,可以直接传给viOpen建立一个会话。
expr参数描述字符串说明:
接口    表达
GPIB    GPIB[0-9]*::?*INSTR
VXI    VXI?*INSTR
GPIB-VXI    GPIB-VXI?*INSTR
GPIB和GPIB-VXI    GPIB?*INSTR
All VXI    ?VXI[0-9]::?INSTR
ASRL    ASRL[0-9]::?*INSTR
All    ?*INSTR

返回值    返回值为函数运行结果。
标识符    值    描述
VI_SUCCESS    0    找到资源。
VI_ERROR_INV_SESSION
VI_ERROR_INV_OBJECT    传递的对象无效。
VI_ERROR_NSUP_OPER    不支持该函数。
VI_ERROR_INV_EXPR    无效的搜索指定。
VI_ERROR_RSRC_NFOUND    没有找到设备。

viFindNext
原型    ViStatus viFindNext(ViFindList findList, ViPRsrc instrDesc);
描述    返回查找资源队列上的下一个资源。
参数    名称    方向    类型    描述
findList    IN    ViFindList    查找队列句柄。必须由viFindRsrc函数创建。
instrDesc    OUT    ViPRsrc    返回一个地址字符串。字符串可以通过调用viOpen函数建立一个会话连接。

返回值    返回值为函数运行结果。
标识符    值    描述
VI_SUCCESS    0    找到资源。
VI_ERROR_INV_SESSION
VI_ERROR_INV_OBJECT    findList不能标志正确的连接。
VI_ERROR_NSUP_OPER    findList不支持该函数。
VI_ERROR_RSRC_NFOUND    没找到资源。

viParseRsrc
原型    ViStatus viParseRsrc(ViSession sesn, ViRsrc rsrcName, ViPUInt16 intfType, ViPUInt16 intfNum);
描述    从语法上分析一个指向设备的资源字符串。这操作分析字符串的有效性。viFindRsrc函数返回的所有字符串都必须在分析成功后才能调用viOpen函数。
返回的intfType和intfNum分别对应VI_ATTR_INTF_TYPE和VI_ATTR_INTF_NUM属性。这些值将与使用viOpen函数连接后使用viGetAttribute函数查询的值一样。
在viOpen函数中设置别名,viParesRsrc函数也能识别。
rsrcName参数不区分大小写。
参数    名称    方向    类型    描述
sesn    IN    ViSession    默认资源管理器(必须经过viOpenDefaultRM函数初始化)。
rsrcName    IN    ViRsrc    资源独立的名称。
intfType    OUT    ViPUInt16    会话连接的接口类型。
intfNum    OUT    ViPUInt16    会话连接的板号。

返回值    返回值为函数运行结果。
标识符    值    描述
VI_SUCCESS    0    资源字符串是有效的。
VI_ERROR_ALLOC    内存不足。
VI_ERROR_INTF_NUM_NCONFIG    接口类型是有效的,但接口号是无效的。
VI_ERROR_INV_RSRC_NAME    无效的资源指示字符串。语法错误。
VI_ERROR_INV_SESSION
VI_ERROR_INV_OBJECT    sesn不能标志正确的连接。
VI_ERROR_LIBRARY_NFOUND    一个VISA必须库无法加载。
VI_ERROR_NSUP_OPER    给定的sesn不支持该函数。例如,该函数仅仅支持默认资源管理器的sesn。
VI_ERROR_RSRC_NFOUND    位置信息不足。

viClear
原型    ViStatus viClear(ViSession vi);
描述    清空设备,执行IEEE 488.1系统的清空操作。
如果连接方式是使用VXI总线,将清空所有连接设备;
如果连接方式是使用GPIB数据采集板,将只清空指定地址的设备;
如果连接方式是使用TCPIP套接字,需要把VI_ATTR_IO_PROT属性设置成VI_PROT_4882_STRS,将相当于向设备发送”*CLS\n”字符串,其他设置操作无效。
参数    名称    方向    类型    描述
vi    IN    ViSession    对象标识符。

返回值    返回值为函数运行结果。
标识符    值    描述
VI_SUCCESS    0    函数执行成功。
VI_ERROR_BERR    总线错误。
VI_ERROR_CONN_LOST    连接丢失。
VI_ERROR_INV_SESSION
VI_ERROR_INV_OBJECT    vi不能标志正确的连接。
VI_ERROR_INV_SETUP    设置无效,不能执行操作。
VI_ERROR_NCIC    非法控制器。
VI_ERROR_NLISTENERS    没有检测到听者。
VI_ERROR_NSUP_OPER    vi不支持此函数
VI_ERROR_RAW_RD_PROT_VIOL    传输时读协议被破坏。
VI_ERROR_RAW_WR_PROT_VIOL    传输时写协议被破坏。
VI_ERROR_RSRC_LOCKED    vi被独占。
VI_ERROR_TMO    操作超时。

viFlush
原型    ViStatus viFlush(ViSession vi, ViUInt16 mask);
描述    手动刷新格式化I/O缓冲区。
参数    名称    方向    类型    描述
vi    IN    ViSession    对象标识符。
mask    IN    ViUInt16    缓冲区类型。

返回值    返回值为函数运行结果。
标识符    值    描述
VI_SUCCESS    0    函数执行成功。
VI_ERROR_INV_MASK    缓冲区类型设置错误
VI_ERROR_INV_SESSION
VI_ERROR_INV_OBJECT    vi不能标志正确的连接。
VI_ERROR_IO    I/O错误
VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作
VI_ERROR_TMO    超时。

viReadSTB
原型    ViStatus viReadSTB(ViSession vi, ViPUInt16 status);
描述    读取一个服务请求状态。例如,在IEEE488.2接口上,这消息将轮训所有的连接设备。其他接口这消息只读取一个设备的服务请求状态。
连接方式是使用TCPIP套接字,如果VI_ATTR_IO_PROT属性的值为VI_PROT_4882_STRS,将向这设备发送字符串”*STB?\n”查询状态,其他设置则操作将无效。
如果这个设备状态信息只有一个字节(BYTE)长度,则另外一个字节设为0。如果服务请求没有在规定时间周期内完成,将返回VI_ERROR_TMO。
参数    名称    方向    类型    描述
vi    IN    ViSession    对象标识符。
status    OUT    ViUInt16    服务请求状态字节。

返回值    返回值为函数运行结果。
标识符    值    描述
VI_SUCCESS    0    函数执行成功。
VI_ERROR_BERR    总线错误。
VI_ERROR_CONN_LOST    连接丢失。
VI_ERROR_INV_SESSION
VI_ERROR_INV_OBJECT    vi不能标志正确的连接。
VI_ERROR_INV_SETUP    设置无效,不能执行操作。
VI_ERROR_NCIC    非法控制器。
VI_ERROR_NLISTENERS    没有检测到听者。
VI_ERROR_NSUP_OPER    vi不支持此函数
VI_ERROR_RAW_RD_PROT_VIOL    传输时读协议被破坏。
VI_ERROR_RAW_WR_PROT_VIOL    传输时写协议被破坏。
VI_ERROR_RSRC_LOCKED    vi被独占。
VI_ERROR_SRQ_NOCCURRED    对象没有收到服务请求。
VI_ERROR_TMO    操作超时。

viRead
原型    ViStatus viRead(ViSession vi, ViBuf buf, ViUInt32 count,ViUInt32 retCount);
描述    同步读取数据。读取的数据存储在buf中。当数据读取完毕函数才返回。任何时间都只能存在一个同步读取。遇到以下情况同步读取结束:
收到END指示器
读取到终止符
读取的数据大小达到count的值
注意:必须设置读取终止符。
参数    名称    方向    类型    描述
vi    IN    ViSession    对象标识符。
buf    OUT    ViBuf    返回数据存取地址。
count    IN    ViUInt32    指定读取长度。
retCount    OUT    ViUInt32    实际读取长度。如果为VI_NULL表示不关心该值。

返回值    返回值为函数运行结果。
标识符    值    描述
VI_SUCCESS    0    成功读取,读取到END指示器结束。
VI_SUCCESS_MAX_CNT    成功读取,已经达到最大长度count。
VI_SUCCESS_TERM_CHAR    成功读取,读取到特定终止符。
VI_ERROR_ASRL_FRAMING    构架错误。
VI_ERROR_ASRL_OVERRUN    溢出错误。
VI_ERROR_ASRL_PARITY    同步错误。
VI_ERROR_BERR    总线错误。
VI_ERROR_CONN_LOST    连接丢失。
VI_ERROR_INV_SESSION
VI_ERROR_INV_OBJECT    vi不能标志正确的连接。
VI_ERROR_INV_SETUP    设置无效,不能执行操作。
VI_ERROR_IO    未知I/O错误。
VI_ERROR_NCIC    非法控制器。
VI_ERROR_NLISTENERS    没有检测到听者。
VI_ERROR_NSUP_OPER    vi不支持此函数
VI_ERROR_OUTP_PROT_VIOL    设备记录一个输出协议错误。
VI_ERROR_RAW_RD_PROT_VIOL    传输时读协议被破坏。
VI_ERROR_RAW_WR_PROT_VIOL    传输时写协议被破坏。
VI_ERROR_RSRC_LOCKED    vi被独占。
VI_ERROR_TMO    操作超时。

viReadAsync
原型    ViStatus viReadAsync(ViSession vi, ViBuf buf, ViUInt32 count, ViJobId jobId);
描述    异步读取数据。读取的数据存储在buf中。当数据读取完毕函数才返回。当数据传输结束时触发一个I/O结束事件。
该函数返回一个jobId表示该操作的标识符,可以使用viTerminate函数传入jobId终止或者等待I/O结束事件来确定异步读操作完成。
参数    名称    方向    类型    描述
vi    IN    ViSession    对象标识符。
buf    OUT    ViBuf    返回数据存取地址。
count    IN    ViUInt32    指定读取长度。
jobId    OUT    ViJobId    异步读操作工作标识符。如果为VI_NULL表示不关心该值。

返回值    返回值为函数运行结果。
标识符    值    描述
VI_SUCCESS    0    异步读成功进入队列。
VI_SUCCESS_SYNC    读操作进行异步。
VI_ERROR_INV_SESSION
VI_ERROR_INV_OBJECT    vi不能标志正确的连接。
VI_ERROR_QUEUE_ERROR    队列错误。
VI_ERROR_RSRC_LOCKED    vi被独占。

viReadToFile
原型    ViStatus viReadToFile (ViSession vi, ViConstString fileName,
ViUInt32 count, ViUInt32 retCount);
描述    同步读取数据并把数据保存到文件中。fileName指定的文件只有只写权限。
如果VI_ATTR_FILE_APPEND_EN属性值为VI_FLASE,数据写入将直接覆盖原来的数据,否则在文件内容尾部添加数据。仅当数据读取和保存操作完成此函数才返回。此函数一般用于保存未处理的数据便于后期处理。
VSIA使用ANSI C(标准C)文件操作。viReadToFile的模式通常是”wb”或者”ab” 。
参数    名称    方向    类型    描述
vi    IN    ViSession    对象标识符。
fileName    IN    ViConstString    写入的文件地址。
count    IN    ViUInt32    读取数据长度。
retCount    OUT    ViUInt32    实际读取数据长度。如果为VI_NULL表示不关心该值。

返回值    返回值为函数运行结果。
标识符    值    描述
VI_SUCCESS    0    操作成功。
VI_SUCCESS_MAX_CNT    读取的数据长度达到了count的值。
VI_SUCCESS_TERM_CHAR    读取到指定的终止符号。
VI_ERROR_ASRL_FRAMING    格式错误。
VI_ERROR_ASRL_OVERRUN    溢出错误。
VI_ERROR_ASRL_PARITY    同步错误。
VI_ERROR_BERR    总线错误。
VI_ERROR_CONN_LOST    连接丢失。
VI_ERROR_FILE_ACCESS    打开文件错误。可能是提供的无效路径或者没有访问权限。
VI_ERROR_FILE_IO    访问文件时发生错误。
VI_ERROR_INV_SESSION
VI_ERROR_INV_OBJECT    vi不能标志正确的连接。
VI_ERROR_INV_SETUP    设置无效,不能执行操作。
VI_ERROR_IO    未知I/O错误。
VI_ERROR_NCIC    非法控制器。
VI_ERROR_NLISTENERS    没有检测到听者。
VI_ERROR_NSUP_OPER    vi不支持此函数
VI_ERROR_OUTP_PROT_VIOL    设备报告输出协议错误。
VI_ERROR_RAW_RD_PROT_VIOL    传输时读协议被破坏。
VI_ERROR_RAW_WR_PROT_VIOL    传输时写协议被破坏。
VI_ERROR_RSRC_LOCKED    vi被独占。
VI_ERROR_TMO    超时。

viWrite
原型    ViStatus viWrite(ViSession vi, ViBuf buf, ViUInt32 count, ViUInt32 retCount);
描述    同步写入数据。写入的数据存储在buf中。当数据写入完毕函数才返回。任何时间都只能存在一个同步写入。
如果retCount的值为VI_NULL将不返回写入数据长度值。
参数    名称    方向    类型    描述
vi    IN    ViSession    对象标识符。
buf    IN    ViBuf    写入数据存放地址。
count    IN    ViUInt32    指定写入长度。
retCount    OUT    ViUInt32    实际写入长度。如果为VI_NULL表示不关心该值。

返回值    返回值为函数运行结果。
标识符    值    描述
VI_SUCCESS    0    成功读取,读取到END指示器结束。
VI_SUCCESS_MAX_CNT    成功读取,已经达到最大长度count。
VI_SUCCESS_TERM_CHAR    成功读取,读取到特定终止符。
VI_ERROR_ASRL_FRAMING    格式错误。
VI_ERROR_ASRL_OVERRUN    溢出错误。
VI_ERROR_ASRL_PARITY    同步错误。
VI_ERROR_BERR    总线错误。
VI_ERROR_CONN_LOST    连接丢失。
VI_ERROR_INV_SESSION
VI_ERROR_INV_OBJECT    vi不能标志正确的连接。
VI_ERROR_INV_SETUP    设置无效,不能执行操作。
VI_ERROR_IO    未知I/O错误。
VI_ERROR_NCIC    非法控制器。
VI_ERROR_NLISTENERS    没有检测到听者。
VI_ERROR_NSUP_OPER    vi不支持此函数
VI_ERROR_OUTP_PROT_VIOL    设备报告输出协议错误。
VI_ERROR_RAW_RD_PROT_VIOL    传输时读协议被破坏。
VI_ERROR_RAW_WR_PROT_VIOL    传输时写协议被破坏。
VI_ERROR_RSRC_LOCKED    vi被独占。
VI_ERROR_TMO    操作超时。

viWriteAsync
原型    ViStatus viWriteAsync(ViSession vi, ViBuf buf, ViUInt32 count, ViJobId jobId);
注意:在安捷伦设备中将调用同步写入。
描述    异步写入数据。需要写入的数据存放在buf中。当数据写入完毕函数才返回。当数据传输完整结束时会触发一个I/O结束事件。
该函数返回一个jobId表示该操作的标识符,可以使用viTerminate函数传入jobId终止或者等待I/O结束事件来确定异步读操作完成。
参数    名称    方向    类型    描述
vi    IN    ViSession    对象标识符。
buf    IN    ViBuf    写入数据存取地址。
count    IN    ViUInt32    写入数据长度。
jobId    OUT    ViJobId    异步写入操作工作标识符。如果为VI_NULL表示不关心该值。

返回值    返回值为函数运行结果。
标识符    值    描述
VI_SUCCESS    0    异步写成功进入队列。
VI_SUCCESS_SYNC    写操作进行异步。
VI_ERROR_INV_SESSION
VI_ERROR_INV_OBJECT    vi不能标志正确的连接。
VI_ERROR_QUEUE_ERROR    队列错误。
VI_ERROR_RSRC_LOCKED    vi被独占。

viWriteFromFile
原型    ViStatus viWriteFromFile (ViSession vi, ViConstString fileName,
ViUInt32 count, ViUInt32 retCount);
描述    从一个指定的文件中获取数据并同步写入设备中。指定的fileName是以只读模式打开读取数据(读取全部数据或者数据长度达到count的值)。读取到的数据都将写入到设备中。该函数仅当操作完成才结束返回。
该操作通常是发送已经经过处理的数据。VISA以ANSI C(标准C)文件操作,所以viWriteFromFile模式一般都是”rb”。如果retCount参数设为VI_NULL,函数将不返回实际发送的数据长度,此操作常用于只需知道是否成功的操作。
参数    名称    方向    类型    描述
vi    IN    ViSession    对象标识符。
fileName    IN    ViConstString    读取的文件地址。
count    IN    ViUInt32    写入数据长度。
retCount    OUT    ViUInt32    实际写入长度。如果为VI_NULL表示不关心该值。

返回值    返回值为函数运行结果。
标识符    值    描述
VI_SUCCESS    0    操作成功。
VI_ERROR_INV_SESSION
VI_ERROR_INV_OBJECT    vi不能标志正确的连接。
VI_ERROR_NSUP_OPER    vi不支持该函数。
VI_ERROR_RSRC_LOCKED    vi被独占。
VI_ERROR_TMO    超时。
VI_ERROR_RAW_RW_PROT_VIOL    传输时读协议被破坏。
VI_ERROR_RAW_RD_PROT_VIOL    传输时写协议被破坏。
VI_ERROR_OUTP_PROT_VIOL    传输时设备报告输入协议错误。
VI_ERROR_BERR    总线错误。
VI_ERROR_NCIC    非法控制器。
VI_ERROR_NLISTENERS    没有检测到听者。
VI_ERROR_IO    未知I/O错误。
VI_ERROR_FILE_ACCESS    打开文件错误。可能是提供的无效路径或者没有访问权限。
VI_ERROR_FILE_IO    访问文件时发生错误。
VI_ERROR_CONN_LOST    连接丢失。

viPrintf
原型    ViStatus viPrintf(ViSession vi, ViString writeFmt, arg1, arg2,…);
描述    格式化字符串并发送格式化后的字符串给设备。(字符串格式化可以参照MFC里CString类中的Format函数。)
不能在同一资源上同时使用viWrite和viPrintf函数。
部分VSIA函数的参数是可变的(如viPrintf, viScanf和viQueryf),导致VB不能调用。用户可以使用与这些函数功能相当的函数代替。
writeFmt参数可以包含普通字符、一般格式化字符和特殊字符。普通字符(包括空格)书写方式与平常一样,不用做任何修改。特殊字符则要在该字符前面加一个反斜杠( \ );格式化字符由百分号( % )和操作标志组成,操作标志后面介绍。
特殊字符
参照下表:
\n    发送一个ASCII码换行符,并且END标志自动一起发送。
\r    发送一个ASCII码回车。
\t    发送一个ASCII码制表符。
###    发送一个指定的八进制数。
\”    发送一个ASCII码双引号。
\    发送一个ASCII码反斜杠。
格式化字符
格式化说明符转换是根据后面的参数值来进行改变和格式化的。格式化完成后直接发送给设备。格式化字符串语法如下:
% [ arraySize , ][ flags ] [ width ] [ . precision ] [ F | N | h | l ] type
arraySize表示数组的大小,逗号表示数组修饰符。arraySize可以是常量,也可以用*代替。*代替需要增加一个参数表示arraySize的值。只支持type 为d和f。
flags表示规定输出格式,可用符号如下:
符号    作用
无    右对齐,左边填充0或空格。

左对齐,右边填充空格。
在数字前增加符号 + 或 - 。
空格    只对负数显示符号。
type = c, s, d, i, u时没有影响。

type = o, x, X时,分别在数值前增加’0’,“0x”,“0X”。
type = e, E, f时,总是使用小数点。
type = g, G时,除了数值为0外总是显示小数点。
width表示控制显示数值的宽度,取值和含义如下:
符号    作用
无    按缺省宽度显示。
n(n=1,2,3…)    宽度至少为n位,不够以空格填充。
0n(n=1,2,3…)    宽度至少为n位,不够左边以0填充。

格式列表中,下一个参数还是width。
precision用于控制小数点后面的位数,取值和含义如下:
符号    作用
无    按缺省精度显示。
0    type=d,i,o,u,x时,没有影响。
type=e,E,f时,不显示小数点。
n(n=1,2,3…)    type=e,E,f时表示的最大小数位数。
type=其他,表示显示的最大宽度。
格式列表中,下一个参数还是precision。
F | N | h | l表示指针是否是远指针或整数是否是长整数。F表示远指针,N表示近指针,h表示短整数或单精度浮点数,l表示长整数或双精度浮点数。
type可用符号如下:
符号    作用    符号    作用
d / i    有符号10进制整数    u    无符号10进制整数
x    小写字母无符号16进制    X    大写字母无符号16进制
f / F    浮点数    e / E    科学记数法表示浮点数
c    单个字符    s    字符串
o    无符号8进制整数    %    显示百分号
p    指针的值    g    自动选择合适的表示法
参数    名称    方向    类型    描述
vi    IN    ViSession    对象标识符。
writeFmt    IN    ViString    格式化字符串。

返回值    返回值为函数运行结果。
标识符    值    描述
VI_SUCCESS    0    参数成功格式化。
VI_ERROR_ALLOC    内存不足。
VI_ERROR_INV_FMT    writeFmt包含无效格式化说明符。
VI_ERROR_INV_SESSION
VI_ERROR_INV_OBJECT    vi不能标志正确的连接。
VI_ERROR_IO    未知I/O错误。
VI_ERROR_NSUP_FMT    writeFmt有不支持的格式说明符。
VI_ERROR_RSRC_LOCKED    vi被独占。
VI_ERROR_TMO    操作超时。

viScanf
原型    ViStatus viScanf(ViSession vi, ViString readFmt, arg1, arg2,…);
描述    这操作从设备读取一个字符串,然后格式化后保存值arg变量中。格式字符串包含说明符,空格字符和普通字符。
VISA中参数不确定的函数(如viPrintf, viScanf, 和 viQueryf)不能被VB调用。可以用功能相似的viVPrintf, viVScanf, 和viVQueryf函数代替。
隐式分割符(空格符,制表符,换行符,回车符)是被忽略的,除非是%c和%[]。除’%’外所有普通字符应该与从设备读取到的字符相匹配。
格式字符串的语法格式如下:
% [ , arraySize ] [ width ] [ F | N | h | l ] type
arraySize表示返回数组的大小,逗号表示数组修饰符。arraySize可以是常量,也可以用#代替。#表示把返回的数组大小保存到一个参数中。只支持type 为d和f。
width表示控制显示数值的宽度,取值和含义如下:
符号    作用
无    按缺省宽度显示。
n(n=1,2,3…)    表示输入数据所占列宽。
F | N | h | l表示指针是否是远指针或整数是否是长整数。F表示远指针,N表示近指针,h表示短整数或单精度浮点数,l表示长整数或双精度浮点数。
type可用符号如下:
符号    作用    符号    作用
d / i    有符号10进制整数    u    无符号10进制整数
x    小写字母无符号16进制    X    大写字母无符号16进制
f / F    浮点数    e / E    科学记数法表示浮点数
c    单个字符    s    字符串
t    以END结尾的字符串    T    以“\n”结尾的字符串
y    二进制数组。

viScanf函数以END结束符结尾或者所有格式字符都匹配完成。如果碰到一个不匹配的字符该函数也将结束,所以先在检测格式化字符串是否匹配前查找END符。
还有在格式化完成后在缓冲区还残留一些数据的话,这些数据将留个下一个viScanf函数使用。
参数    名称    方向    类型    描述
vi    IN    ViSession    对象标识符。
writeFmt    IN    ViString    格式化字符串。

返回值    返回值为函数运行结果。
标识符    值    描述
VI_SUCCESS    0    成功读到数据并且格式化到arg参数里。
VI_ERROR_ALLOC    内存不足。
VI_ERROR_INV_FMT    writeFmt包含无效格式化说明符。
VI_ERROR_INV_SESSION
VI_ERROR_INV_OBJECT    vi不能标志正确的连接。
VI_ERROR_IO    未知I/O错误。
VI_ERROR_NSUP_FMT    writeFmt有不支持的格式说明符。
VI_ERROR_RSRC_LOCKED    vi被独占。
VI_ERROR_TMO    操作超时。

viQueryf
原型    ViStatus viQueryf(ViSession vi, ViString writeFmt, ViString readFmt, arg1, arg2,…);
描述    这函数执行一个格式化写和进行一个读取操作请求。这函数提供一个机制“发送,然后读取”一个典型的从设备获取数据的命令。读取是在发送命令后立即执行的。
该函数相当于viPrintf函数和viScanf函数结合起来。arg先匹配writeFmt,然后在匹配readFmt。具体格式化格式请参考viPrintf函数和viScanf函数的说明。
该函数的返回值和viPrintf, viScanf, viFlush一样。
VISA中参数不确定的函数(如viPrintf, viScanf, 和 viQueryf)不能被VB调用。可以用功能相似的viVPrintf, viVScanf, 和viVQueryf函数代替。
参数    名称    方向    类型    描述
vi    IN    ViSession    对象标识符。
writeFmt    IN    ViString    写入格式化字符串。
readFmt    OUT    ViString    读取格式化字符串。

返回值    返回值为函数运行结果。
标识符    值    描述
VI_SUCCESS    0    成功完成一个查询操作。
VI_ERROR_ALLOC    内存不足。
VI_ERROR_INV_FMT    0xBFFF003F    writeFmt包含无效格式化说明符。
VI_ERROR_INV_SESSION
VI_ERROR_INV_OBJECT    vi不能标志正确的连接。
VI_ERROR_IO    未知I/O错误。
VI_ERROR_NSUP_FMT    0xBFFF0041    writeFmt有不支持的格式说明符。
VI_ERROR_RSRC_LOCKED    vi被独占。
VI_ERROR_TMO    0xBFFF0015    操作超时。

viSetAttribute
原型    ViStatus viSetAttribute(ViSession vi, ViAttr attribute, ViAttrState attrState);
ViStatus viSetAttribute(ViEvent vi, ViAttr attribute, ViAttrState attrState);
ViStatus viSetAttribute(ViFindList vi, ViAttr attribute, ViAttrState attrState);
描述    修改指定对象的指定属性值。
如果一个资源属性不能被修改,并且该资源是有效的和属性说明不能指定为其他值,viSetAttribute将返回错误代码VI_ERROR_NSUP_ATTR_STATE。
VI_WARN_NSUP_ATTR_STATE和VI_ERROR_NSUP_ATTR_STATE都指明传递的值不是有效值。除特殊情况外,一般都返回错误代码VI_ERROR_NSUP_ATTR_STATE,如果返回完成代码VI_WARN_NSUP_ATTR_STATE表示不支持传递的值,但操作没有失败。
参数    名称    方向    类型    描述
vi    IN    ViSession
ViEvent
ViFindList    对象标识符。
事件标识符。
查找队列。
attribute    IN    ViAttr    要设置的资源属性。
attrState    OUT    ViAttrState    要设置的值。

返回值    返回值为函数运行结果。
标识符    值    描述
VI_SUCCESS    0    成功设置资源属性。
VI_WARN_NSUP_ATTR_STATE    设置的属性是有效的,但不支持此属性启用。(这请求将停止,但可能会有性能改变。)
VI_ERROR_ATTR_READONLY    只读属性。
VI_ERROR_INV_SESSION
VI_ERROR_INV_OBJECT    vi不能标志正确的连接。
VI_ERROR_NSUP_ATTR    该资源中没有指定的属性。
VI_ERROR_NSUP_ATTR_STATE    传的值不是有效值,或者该属性不支持该定义的值。(该操作将被阻止并返回错误。)
VI_ERROR_RSRC_LOCKED    vi被上锁。

viGetAttribute
原型    ViStatus viGetAttribute(ViSession vi, ViAttr attribute, void _VI_PTR attrState);
ViStatus viGetAttribute(ViEvent vi, ViAttr attribute, void _VI_PTR attrState);
ViStatus viGetAttribute(ViFindList vi, ViAttr attribute, void _VI_PTR attrState);
描述    返回指定对象的指定属性值。
参数    名称    方向    类型    描述
vi    IN    ViSession
ViEvent
ViFindList    对象标识符。
事件标识符。
查找队列。
attribute    IN    ViAttr    要返回的资源属性。
attrState    OUT    void*    要返回的属性值存放位置的指针。由于属性值类型长度不同,所以必须要先明确属性类型来分配存放的内存空间。

返回值    返回值为函数运行结果。
标识符    值    描述
VI_SUCCESS    0    成功获取资源属性。
VI_ERROR_INV_SESSION
VI_ERROR_INV_OBJECT    vi不能标志正确的连接。
VI_ERROR_NSUP_ATTR    该资源中没有指定的属性。

viLock
原型    ViStatus viLock(ViSession vi, ViAccessMode lockType, ViUInt32 timeout,
ViKeyId requestedKey, ViKeyId accessKey);
注意:viLock函数不支持网络设备。
描述    该函数用于给一个资源加锁,加锁后可以使其他会话无法访问被加锁的资源。其他会话在访问被加锁的资源的时候会等待一段时间,如果等待结束资源还没解锁访问将返回一个错误。
共享锁能被一个或者多个会话加载在一个资源上,构成嵌套锁。
当lockType为VI_EXCLUSIVE_LOCK时,requestedKey和accessKey是无效的,应该设置为VI_NULL。
当lockType为VI_SHARED_LOCK时,可以通过requestedKey参数指定一个密匙。如果vi没有加锁,requestedKey的值将会作为访问密匙。如果vi加锁了,并且requestedKey的值与访问密匙相同,则vi取得访问权限,否则返回错误。
同样的requestedKey的值也可以定义为VI_NULL。如果vi没有加锁,将产生一个随机的唯一访问密匙通过accessKey返回。如果vi加锁了,则返回错误。
viLock可以对同一会话多次上同一类型的锁,会有一个内部计数。调用一次viLock计数+1,当计数大于0时调用一次viUnLock计数-1,当计数为0时调用viUnLock计数不变。当计数为0时才为真正解锁。
参数    名称    方向    类型    描述
vi    IN    ViSession    对象标识符。
lockType    IN    ViAccessMode    指定加锁类型,可以是VI_EXCLUSIVE_LOCK(独占锁)或者 VI_SHARED_LOCK(共享锁)。
timeout    IN    ViUInt32    其他操作需要访问此被加锁的对象时等待timeout(ms)后未解锁就返回错误。除开数值外还可以设置为VI_TMO_IMMEDIATE (立即)和VI_TMO_INFINITE(一直等待)。
requestedKey    IN    ViKeyId    当lockType为VI_EXCLUSIVE_LOCK时此值设为VI_NULL。
当lockType为VI_SHARED_LOCK时,可以传入VI_NULL或者密匙。详情看描述。
accessKey    OUT    ViKeyId    当lockType为VI_EXCLUSIVE_LOCK时此值设为VI_NULL。
当lockType为VI_SHARED_LOCK时,此参数返回一个唯一的密匙,其他会话可以用该密匙与这个资源加共享锁。

返回值    返回值为函数运行结果。
标识符    值    描述
VI_SUCCESS    0    成功以指定模式上锁。
VI_SUCCESS_NESTED_EXCLUSIVE    成功上独占锁。(多次上锁)
VI_SUCCESS_NESTED_SHARED    成功上共享锁。(多次上锁)
VI_ERROR_INV_ACCESS_KEY    requestedKey不是改资源共享锁的密匙。
VI_ERROR_INV_LOCK_TYPE    指定的资源不支持上锁。
VI_ERROR_INV_SESSION
VI_ERROR_INV_OBJECT    vi不能标志正确的连接。
VI_ERROR_RSRC_LOCKED    已经被一个与该函数加锁类型不兼容的锁加锁了。
VI_ERROR_TMO    操作超时。

viUnLock
原型    ViStatus viUnLock(ViSession vi);
描述    用于释放以前使用viLock函数加的锁。
参数    名称    方向    类型    描述
vi    IN    ViSession    对象标识符。

返回值    返回值为函数运行结果。
标识符    值    描述
VI_SUCCESS    0    成功解锁。
VI_SUCCESS_NESTED_EXCLUSIVE    函数调用成功,但对象还是被加了独占锁。
VI_SUCCESS_NESTED_SHARED    函数调用成功,但对象还是被加了共享锁。
VI_ERROR_INV_SESSION
VI_ERROR_INV_OBJECT    vi不能标志正确的连接。
VI_ERROR_SESN_NLOCKED    vi没有被加锁。

viInstallHandler
原型    ViStatus viInstallHandler(ViSession vi, ViEventType eventType,
ViHndlr handler, ViAddr userHandle);
描述    该函数给一个会话安装事件回调函数。
参数    名称    方向    类型    描述
vi    IN    ViSession    对象标识符。
eventType    IN    ViEventType    事件逻辑标识符。
handler    IN    ViHndlr    回调函数地址。
userHandle    IN    ViAddr    传递一个值用以区分在同一事件内的回调函数。

返回值    返回值为函数运行结果。
标识符    值    描述
VI_SUCCESS    0    处理函数安装成功。
VI_ERROR_HNDLR_NINSTALLED    安装识别,可能是多个处理函数安装在同一个会话上的同一个事件上。
VI_ERROR_INV_EVENT    该会话不支持该事件。
VI_ERROR_INV_HNDLR_REF    处理函数无效。
VI_ERROR_INV_SESSION
VI_ERROR_INV_OBJECT    vi不能标志正确的连接。

属性
一般的INSTR资源属性
属性字段    权限    类型    范围    默认值    说明
VI_ATTR_INTF_NUM    RO    全局    ViUInt16    0 到 0xFFFF    0    给定接口的板号。
VI_ATTR_INTF_TYPE    RO    全局    ViUInt16    VI_INTF_GPIB(1)
VI_INTF_VXI(2)
VI_INTF_GPIB_VXI(3)
VI_INTF_ASRL(4)
VI_INTF_PXI(5)
VI_INTF_TCPIP(6)
VI_INTF_USB(7)    N/A    给定会话的总线类型。
VI_ATTR_INTF_INST_
NAME    RO    全局    ViString    N/A    N/A    给定接口的文本描述。
VI_ATTR_IO_PROT    RW    本地    ViUInt16    VI_NORMAL (1)
VI_FDC(2)
VI_HS488(3)
VI_PROT_488_2_STRS(4)    VI_NORMAL
指定使用哪个一个协议。在VXI中可以选择VI_NORMAL (正常字符)和VI_FDC (快速数据通道);在GPIB中额可以选择VI_NORMAL和VI_HS488(高速数据传输);在ASRL中可以选择VI_NORMAL和VI_PROT_488_2_STRS(488风格传输);在viAssertTrigger / viReadSTB / viClear函数中发送488.2定义的字符串。
VI_ATTR_RD_BUF_
OPER_MODE    RW    本地    ViUInt16    VI_FLUSH_ON_ACCESS
VI_FLUSH_DISABLE    VI_FLUSH_DISABLE    指定读取缓冲区的模式。
VI_FLUSH_DISABLE:仅当调用viFlush函数时才清空缓冲区。
VI_FLUSH_DISABLE:调用viScanf函数后就清空缓冲区。
VI_ATTR_SEND_END_
EN    RW    本地    ViBoolean    VI_TRUE
VI_FALSE    VI_TRUE    缓冲区是否以END结尾。
VI_ATTR_SUPPRESS_
END_EN    RW    本地    ViBoolean    VI_TRUE
VI_FALSE    VI_FALSE    是否支持END终止符。
VI_TRUE:END不终止读操作。
VI_FALSE:END终止读操作。
VI_ATTR_TERMCHAR    RW    本地    ViUInt8    0 到 0xFF    0x0A
(‘\n’)    结束字符。
VI_ATTR_TERMCHAR_
EN    RW    本地    ViBoolean    VI_TRUE
VI_FALSE    VI_FALSE    读操作时当遇到一个结束符时是否终止。
VI_ATTR_TMO_VALUE    RW    本地    ViUInt32    VI_TMO_IMMEDIATE
1 到 0xFFFFFFFE
VI_TMO_INFINITE    2000 msec    超时值,单位毫秒。
如果值为VI_TMO_INFINITE将一直等待下去。
VI_ATTR_TRIG_ID    RW    本地    ViUInt16    VI_TRIG_SW;
VI_TRIG_TTL0 到
VI_TRIG_TTL7;
VI_TRIG_ECL0 到
VI_TRIG_ECL1    VI_TRIG_SW    当前触发机制标识符。
VI_ATTR_WR_BUF_OPER_MODE    RW    本地    ViUInt16    VI_FLUSH_ON_ACCESS
VI_FLUSH_WHEN_FULL    VI_FLUSH_WHEN_FULL    指定写缓冲区的模式。
VI_FLUSH_WHEN_FULL:当写入一个END终止符或者缓冲区慢了的时候清空缓冲区。
VI_FLUSH_ON_ACCESS:调用viPrintf函数后就清空缓冲区。
VI_ATTR_DMA_ALLOW_EN    RW    本地    ViBoolean    VI_TRUE
VI_FALSE    N/A    该属性规定是否I/O访问使用DMA (VI_TRUE)或可编程I/O (VI_FALSE)。在一些实现中,该属性有全局影响。
VI_ATTR_FILE_APPEND_EN    RW    本地    ViBoolean    VI_TRUE
VI_FALSE    VI_FALSE    该属性指定viReadToFile对文件操作是覆盖还是追加。
GPIB和VXI特殊的INSTR资源属性
属性字段    权限    类型    范围    默认值    说明
VI_ATTR_GPIB_PRIMARY_ADDR    RO    全局    ViUInt16    0 to 30
N/A    给定会话的GPIB主地址。
VI_ATTR_GPIB_SECONDARY_ADDR    RO    全局    ViUInt16    0 to 31,
VI_NO_SEC_ADDR    N/A    给定会话的GPIB次地址。
VI_ATTR_GPIB_READDR_EN    RW    本地    ViBoolean    VI_TRUE
VI_FALSE    VI_TRUE    这属性指定是否在读写操作之前重新寻址。
VI_ATTR_GPIB_UNADDR_EN    RW    本地    ViBoolean    VI_TRUE
VI_FALSE    VI_FALSE    这属性指定是否在读写操作之后不寻址。
VI_ATTR_GPIB_REN_STATE    RO    全局    ViUInt16    VI_STATE_UNKNOWN
VI_STATE_ASSERTED
VI_STATE_UNASSERTED    N/A    这属性返回当前GPIB REN线状态。
其他与GPIB无关的特殊INSTR资源属性

事件
VI_EVENT_SERVICE_REQUEST
描述    设备发送的服务请求收到
属性    属性名    说明    权限    数据类型    范围
VI_ATTR_EVENT_TYPE    事件类型    只读    ViEventType    VI_EVENT_SERVICE_REQ

VI_EVENT_VXI_SIGP
描述    设备发送的服务请求收到
属性    属性名    说明    权限    数据类型    范围
VI_ATTR_EVENT_TYPE    事件类型    只读    ViEventType    VI_EVENT_VXI_STOP
VI_ATTR_SIGP_STATUS_ID    在IACK循环或者信号寄存器中获取16位状态/ID值。    只读    ViUInt16    0 到0xFFFF

VI_EVENT_TRIG
描述    触发中断收到,对VISA,    唯一可以被感知的触发是VXI硬件触发。
属性    属性名    说明    权限    数据类型    范围
VI_ATTR_EVENT_TYPE    事件类型    只读    ViEventType    VI_EVENT_TRIG
VI_ATTR_RECV_TRIG_ID    指定哪个触发事件接收触发机制。    只读    ViUInt16    VI_TRIG_TTL0 到
VI_TRIG_TTL7;
VI_TRIG_ECL0 到
VI_TRIG_ECL1

VI_EVENT_IO_COMPLETION
描述    异步操作完成。
属性    属性名    说明    权限    数据类型    范围
VI_ATTR_EVENT_TYPE    事件类型    只读    ViEventType    VI_EVENT_IO_COMPLETION
VI_ATTR_STATUS    异步操作返回代码。    只读    ViStatus    N/A
VI_ATTR_JOB_ID    异步操作的作业ID。    只读    ViJobId    N/A
VI_ATTR_BUFFER    异步操作的寄存器地址。    只读    ViBuf    N/A
VI_ATTR_RET_COUNT    异步操作真实大小。    只读    ViUInt32    0 到0xFFFFFFFF
VI_ATTR_OPER_NAME    产生这事件操作的名称。    ViString    N/A
 


用VISA函数操作仪器的步骤
打开VISA资源管理器句柄,用到的函数:viOpenDefaultRM;
打开仪器句柄,用到的函数:viFindRsrc、viFindNext、viOpen等;
设置仪器状态、控制仪器操作、读取测量数据、处理仪器事件,用到的函数: viGetAttribute、viSetAttribute、viIn16、viOut16、viPrintf、viScanf、viInstallHandler、viUninstallHandler、viEnableEvent、viDisableEvent、viWaitOnEvent等;
释放仪器句柄,用到的函数:viClose;
释放VISA资源管理器句柄,用到的函数:viClose。

VISA函数应用举例
void main(void)
{
  error=viOpenDefaultRM (&rsrcManager); /*打开VISA资源管理器*/
  //rsrcManager为得到的VISA资源管理器句柄
  if(error!=VI_SUCCESS) /*如果出错,弹出错误信息对话框,返回*/
  { MessagePopup("Error","Open VISA Resource Manager Error!");
   return;
  }
  error = viOpen (rsrcManager, "VXI0::16::INSTR", VI_NULL, VI_NULL,          &instHandle);   //instHandle为得到的仪器句柄

  if(error!=VI_SUCCESS){ 
   MessagePopup("Error","Open Instrument Error!");
   return;
  }
  else{ /*获取仪器模块代码,设置仪器操作超时时间为2000毫秒*/
   viGetAttribute (instHandle, VI_ATTR_MODEL_CODE, &moduleID);    viSetAttribute (instHandle, VI_ATTR_TMO_VALUE, 2000);
  }
  viClose(instHandle); /*关闭仪器句柄和VISA资源管理器*/
  viClose(rsrcManager);
}
————————————————
版权声明:本文为CSDN博主「鱼喝水」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yu__jia/article/details/46044083

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章