当前位置: 首页 > news >正文

虚拟仪器系统I/O接口软件——VISA(3)

3.3.4 VISA仪器控制组织器资源
VISA仪器控制组织器资源在资源模板的基础上,扩展了自己的属性、事件与操作,实现多仪器控制资源的管理机制,使多个仪器合理地分配通信通道,进行多对话通道操作。组织器所定义的资源即为VISA仪器控制组织器资源。
n VISA仪器控制组织器资源(VI_RSRC_VISA_IC_ORG):
1. 资源概述:为多仪器的控制资源提供存取能力。
2. 资源属性表及属性描述:
属性名 描述
VI_ATTR_ACC_MODE 操作模式
VI_ATTR_RESOURCES 资源名列表
3. VISA仪器控制组织器资源定义的事件如下所示:无
4. VISA仪器控制组织器资源定义的操作如下:
viGetRsrcSession(sesn,refName,accessMode,vi
4.1. viGetRsrcSession(sesn,refName,accessMode,vi
1) 目标:返回一特定VISA仪器控制组织器的资源对话通道
2) 参数表:
参数名 输入/输出方向 数据类型 描述
sesn 输入 ViSession 组织器对话通道标识符
refName 输入 ViRsrc 资源名
accessMode 输入 ViAccessMode 存取模式
vi 输出 ViSession 资源对话通道标识符
3) 返回状态值:
完成代码:
VI_SUCCESS 资源关联完成
错误代码:
VI_ERROR_INV_SESSIONvi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED 存取锁定模式不支持特定操作
VI_ERROR_ABORT 传送时用户退出
VI_ERROR_INV_REF_NAME 资源名不当
4) 描述:该操作用于VISA仪器控制组织器对话通道获取资源的存取能力。
5) 相关项:viAttachRsrc()、viDetachRsrc()。
6) 实现要求:viClose()将关闭所有由viGetRsrcSession()打开的资源通道。

3.3.5 VISA特定接口仪器控制资源
在VISA资源模板的基础上,VISA特定接口仪器控制资源定义了仪器控制特有的属性、事件与操作。在仪器控制资源中定义的功能是特定的仪器功能,每个控制与操作功能都有明确的仪器对象。
VISA特定接口仪器控制资源中包括:
n GPIB总线接口控制资源
n VXI总线器件配置资源
n VXI总线接口控制资源
n VXI总线零槽资源
n VXI总线系统中断资源
n VXI总线信号处理器资源
n VXI总线信号资源
n VXI总线中断资源
n VXI总线扩展接口资源
n 异步串行总线接口控制资源
下面分别对各个资源进行详尽描述。
n GPIB总线接口控制资源(VI_RSRC_GPIB_INTF):
1. 资源概述:对GPIB总线进行存取,实现GPIB器件的状态并行轮询及远程/当地控制操作。
2. 资源属性表及属性描述:
属性名 描述
VI_ATTR_GPIB_ATN ATN线当前状态
VI_ATTR_GPIB_BUS_TIMING 接口资源握手延时值
VI_ATTR_GPIB_DATA GPIB数据线(D0~D7)状态
VI_ATTR_GPIB_DAV DAV线当前状态
VI_ATTR_GPIB_EOI EOI线当前状态
VI_ATTR_GPIB_GLOB_TLC_MODE 接口当前讲者/听者/控者模式
VI_ATTR_GPIB_HS488_CBL_LEN HS488电缆长度
VI_ATTR_GPIB_IFC IFC线当前状态
VI_ATTR_GPIB_LOCAL_PP 是否允许并行轮询
VI_ATTR_GPIB_NDAC NDAC线当前状态
VI_ATTR_GPIB_NRFD NRFD线当前状态
VI_ATTR_GPIB_REM REM线当前状态
VI_ATTR_GPIB_SRQ SRQ线当前状态
VI_ATTR_PHYS_ADDR 器件地址
VI_ATTR_SYS_CNTLR 是否置为系统控者
VI_ATTR_7_8_BIT_CMP 终止符有效位
VI_ATTR_SEND_END_ON 终止符是否插入EOI
_TERMCHAR_EN
VI_ATTR_GPIB_IST 是否允许并行轮询
VI_ATTR_GPIB_SES_ADDR GPIB对话通道地址
VI_ATTR_GPIB_SES_STAT 32位状态变量
VI_ATTR_GPIB_TLC_MODE 对话通道当前讲者/听者/控制模式
VI_ATTR_PROTOCOL 协议
VI_ATTR_SEND_END 写操作最后一个字节是否插入EOI
VI_ATTR_TERMCHAR 终止符
VI_ATTR_TERMCHAR_EN 终止符是否有效
VI_ATTR_TMO_UNIT 超时值单位
VI_ATTR_TMO 超时值
VI_ATTR_TRANSPORT 传送机制
3. GPIB总线接口控制资源定义的事件如下所示:
事件 说明
VI_EVENT_GPIB_REM GPIB REM线有效引发事件
VI_EVENT_GPIB_ATN GPIB ATN线有效引发事件
VI_EVENT_GPIB_TALK 对话通道置为讲者引发事件
VI_EVENT_GPIB_LISTEN 对话通道置为听者引发事件
VI_EVENT_GPIB_CIC 对话通道置为责任控者引发事件
VI_EVENT_GPIB_LOK 对话通道处于锁定状态
VI_EVENT_GPIB_END 对话通道接收到EOI
VI_EVENT_GPIB_CMPL 对话通道完成一个传送
VI_EVENT_GPIB_DCAS 对话通道处于器件清除激活状态(DCAS)
VI_EVENT_GPIB_DTAS 对话通道处于器件触发激活状态(DTAS)
VI_EVENT_GPIB_SPAS 对话通道处于串行轮询激活状态(SPAS)
4. GPIB总线接口控制资源定义的操作如下:
viGPIBRead(vibufcountretCount
viGPIBReadAsync(vibufcount,jobId)
viGPIBReadStatus(vi,jobId,status)
viGPIBWrite(vibufcountretCount
viGPIBWriteAsync(vibufcount,jobId)
viGPIBWriteStatus(vi,jobId,status)
viGPIBCommand(vibufcountretCount
viGPIBCommandAsync(vibufcount,jobId)
viGPIGCommandStatus(vi,jobId,status)
viSendIFC(vi
viTakeControl(vi,sync)
viGoToStandby(vi,shake)
viListen(vi,address)
viLocal(vi
viRemoteEnable(vi,rem)
viPPollConfig(vi,address,ppc)
viPPoll(vi,result)
4.1. viGPIBRead(vibufcountretCount
1) 目标:从GPIB总线读取数据
2) 参数表:与viRead()一致。
3) 返回状态值:
完成代码:
VI_SUCCESS 数据读取完成
VI_SUCCESS_TERM_CHAR 特定终止符被读取
VI_SUCCESS_MAX_CNT 读取的字节数与count数相同
错误代码:
VI_ERROR_INV_SESSIONvi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED 存取锁定模式不支持特定操作
VI_ERROR_TMO 超时错误
VI_ERROR_ABORT 传送时用户退出
VI_ERROR_CLR_ABORT 传送时器件清除
VI_ERROR_NADDRESSED 接口没有置为听状态
4) 描述:该操作将从器件中读取的值放在buf
5) 相关项:参见viGPIBReadAsync()、viGPIBReadStatus()。
6) 实现要求:无。
4.2. viGPIBReadAsync(vibufcount,jobId)
1) 目标:从GPIB总线异步读取数据
2) 参数表:与viReadAsync()一致。
3) 返回状态值:
完成代码:
VI_SUCCESS 异步数据读取完成
错误代码:
VI_ERROR_INV_SESSIONvi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED 存取锁定模式不支持特定操作
VI_ERROR_QUEUE_ERROR 不能进行异步操作排队
4) 描述:该操作将从器件中读取的值放在buf
5) 相关项:参见viGPIBRead()、viGPIBReadStatus()。
6) 实现要求:无。
4.3. viGPIBReadStatus(vi,jobId,jobStatus)
1) 目标:获取GPIB读操作状态
2) 参数表:与viReadStatus()一致。
3) 返回状态值:
完成代码:
VI_SUCCESS 状态获取完成
错误代码:
VI_ERROR_INV_SESSIONvi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED 存取锁定模式不支持特定操作
VI_ERROR_INV_JOBID 作业标识符不当
4) 描述:当操作为同步时,标识符唯一确定,为VI_SYNC;当操作为异步时,标识符为操作的输出参数值。
5) 相关项:参见viGPIBReadAsync()、viGPIBRead()。
6) 实现要求:无。
4.4. viGPIBWrite(vibufcountretCount
1) 目标:将数据同步写入到GPIB总线中
2) 参数表:与viWrite()一致。
3) 返回状态值:
完成代码:
VI_SUCCESS 数据写入完成
错误代码:
VI_ERROR_INV_SESSIONvi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED 存取锁定模式不支持特定操作
VI_ERROR_TMO 超时错误
VI_ERROR_ABORT 传送时用户退出
VI_ERROR_CLR_ABORT 传达时器件清除
VI_ERROR_NADDRESSED 接口未置为听者状态
VI_ERROR_NLISTENERS 没有听者状态被检测到
4) 描述:该操作将位于buf中的数据写入到GPIB总线中去,任一写资源通道只能登录一个同步写操作。
5) 相关项:参见viGPIBWriteAsync()、viGPIBWriteStatus()。
6) 实现要求:无。
4.5. viGPIBWriteAsync(vibufcount,jobId)
1) 目标:将数据异步写入到GPIB总线中
2) 参数表:与viWriteAsync()一致。
3) 返回状态值:
完成代码:
VI_SUCCESS 异步写操作完成
错误代码:
VI_ERROR_INV_SESSIONvi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED 存取锁定模式不支持特定操作
VI_ERROR_QUEUE_ERROR 不能进行写操作排队
4) 描述:该操作将位于buf中的数据写入到GPIB总线中去,任一写资源通道可以登录多个异步写操作,进行排队处理。
5) 相关项:参见viGPIBWrite()、viGPIBWriteStatus()。
6) 实现要求:无。
4.6. viGPIBWriteStatus(vi,jobId,jobStatus)
1) 目标:获取GPIB写操作状态
2) 参数表:与viWriteStatus()一致。
3) 返回状态值:
完成代码:
VI_SUCCESS 状态获取完成
错误代码:
VI_ERROR_INV_SESSIONvi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED 存取锁定模式不支持特定操作
VI_ERROR_INV_JOBID 作业标识符不当
4) 描述:当操作为同步时,标识符唯一确定,为VI_SYNC;当操作为异步时,标识符为操作的输出参数值。
5) 相关项:参见viGPIBWrite()、viGPIBWriteAsync()。
6) 实现要求:无。
4.7. viGPIBCommand(vibufcountretCount
1) 目标:将命令同步写入到GPIB总线中
2) 参数表:与viGPIBWrite()一致。
3) 返回状态值:
完成代码:
VI_SUCCESS 发送命令完成
错误代码:
VI_ERROR_INV_SESSIONvi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED 存取锁定模式不支持特定操作
VI_ERROR_TMO 超时错误
VI_ERROR_ABORT 传送时用户退出
VI_ERROR_NCICvi未表示为当前责任控者
VI_ERROR_NLISTENERS 没有听者状态被检测到
4) 描述:该操作将位于buf中的命令写入到GPIB总线中去。
5) 相关项:参见viGPIBCommandAsync()、viGPIBCommandStatus()。
6) 实现要求:无。
4.8. viGPIBCommandAsync(vibufcount,jobId)
1) 目标:将命令异步写入到GPIB总线中
2) 参数表:与viGPIBWriteAsync()一致。
3) 返回状态值:与viGPIBWriteAsync()一致。
4) 描述:该操作将位于buf中的命令异步写入到GPIB总线中去。
5) 相关项:参见viGPIBCommand()、viGPIBCommandStatus()。
6) 实现要求:无。
4.9. viGPIBCommandStatus(vi,jobId,jobStatus)
1) 目标:获取GPIB命令操作状态
2) 参数表:与viGPIBWriteStatus()一致。
3) 返回状态值:与viGPIBWriteStatus()一致。
4) 描述:当操作为同步时,标识符唯一确定,为VI_SYNC;当操作为异步时,标识符为操作的输出参数值。
5) 相关项:参见viGPIBCommand()、viGPIBCommandAsync()。
6) 实现要求:无。
4.10. viSendIFC(vi
1) 目标:置GPIB IFC线有效至少100微秒
2) 参数表:
参数名 输入/输出方向 数据类型 描述
vi 输入 ViSession 对话通道标识符(句柄)
3) 返回状态值:
完成代码:
VI_SUCCESS 置GPIB IFC线完成
错误代码:
VI_ERROR_INV_SESSIONvi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED 存取锁定模式不支持特定操作
VI_ERROR_NSYS_CNTLRvi不能置为系统控者
4) 描述:该操作只有在当前vi为系统控者时才有效。
5) 相关项:无。
6) 实现要求:无。
4.11. viTakeControl(vi,sync)
1) 目标:取得GPIB总线控制同步操作
2) 参数表:
参数名 输入/输出方向 数据类型 描述
vi 输入 ViSession 对话通道标识符(句柄)
sync 输入 ViBoolean 同步操作还是异步操作
3) 返回状态值:
完成代码:
VI_SUCCESS 控制取得完成
错误代码:
VI_ERROR_INV_SESSIONvi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED 存取锁定模式不支持特定操作
VI_ERROR_NCICvi不能置为责任控者
4) 描述:该操作通过将ATN接口线置高以取得总线控制权,该操作是对于vi置为责任控者时才有效。
5) 相关项:无。
6) 实现要求:无。
4.12. viGoToStandby(vi,shake)
1) 目标:使GPIB ATN接口线无效,接受者可以任意握手
2) 参数表:
参数名 输入/输出方向 数据类型 描述
vi 输入 ViSession 对话通道标识符(句柄)
shake 输入 ViBoolean ATN线无效后是否接受者执行握手
3) 返回状态值:
完成代码:
VI_SUCCESS 总线旁路完成
错误代码:
VI_ERROR_INV_SESSIONvi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED 存取锁定模式不支持特定操作
VI_ERROR_NCICvi不能置为责任控者
VI_ERROR_BAD_ADDR_STATE ATN线已经置为无效
4) 描述:该操作是对于vi置为责任控者时才有效。
5) 相关项:无。
6) 实现要求:当接受者握手被执行,接口需要延时一段时间才会进行数据传送。

4.13. viListen(vi,address)
1) 目标:检查GPIB总线上听者器件是否存在
2) 参数表:
参数名 输入/输出方向 数据类型 描述
vi 输入 ViSession 对话通道标识符(句柄)
address 输入 ViPhysAddr GPIB器件地址
3) 返回状态值:
完成代码:
VI_SUCCESS 操作完成
VI_SUCCESS_DEV_NPRESENT 操作完成,但器件没有在特定地址上
错误代码:
VI_ERROR_INV_SESSIONvi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED 存取锁定模式不支持特定操作
VI_ERROR_NCICvi不能置为责任控者
VI_ERROR_INV_ADDR 地址表示不正确
4) 描述:该操作只有当vi置为责任控者且address表示的地址不代表vi时才有效。
5) 相关项:无。
6) 实现要求:无。
4.14. viLocal(vi
1) 目标:置接口为当地模式
2) 参数表:
参数名 输入/输出方向 数据类型 描述
vi 输入 ViSession 对话通道标识符(句柄)
3) 返回状态值:
完成代码:
VI_SUCCESS 操作完成
错误代码:
VI_ERROR_INV_SESSIONvi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED 存取锁定模式不支持特定操作
4) 描述:当接口处于锁定状态时,该操作无效。
5) 相关项:无。
6) 实现要求:无。
4.15. viRemoteEnable(vi,rem)
1) 目标:控制GPIB REM接口线状态
2) 参数表:
参数名 输入/输出方向 数据类型 描述
vi 输入 ViSession 对话通道标识符(句柄)
rem 输入 ViBoolean REM接口线状态
3) 返回状态值:
完成代码:
VI_SUCCESS 操作完成
错误代码:
VI_ERROR_INV_SESSIONvi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED 存取锁定模式不支持特定操作
VI_ERROR_NSYS_CNTLRvi不能置为系统控者
4) 描述:该操作只有当vi置为系统控者时才有效。
5) 相关项:无。
6) 实现要求:无。
4.16. viPPollConfig(vi,address,ppc)
1) 目标:设置GPIB器件为并行轮询
2) 参数表:
参数名 输入/输出方向 数据类型 描述
vi 输入 ViSession 对话通道标识符(句柄)
address 输入 ViPhysAddr GPIB器件地址
ppc 输入 ViUInt8 必须包括PPE或PPD命令
3) 返回状态值:
完成代码:
VI_SUCCESS 操作完成
错误代码:
VI_ERROR_INV_SESSIONvi不能标识正当对话通道
VI_ERROR_TMO 超时错误
VI_ERROR_RSRC_LOCKED 存取锁定模式不支持特定操作
VI_ERROR_NCICvi不能置为责任控者
VI_ERROR_INV_ADDR 地址表示不正确
VI_ERROR_LOCAL_CONFIG 在远程控制状态下进行当地配置
VI_ERROR_INV_PPC ppc不能包括一个正确的并行轮询配置
4) 描述:该操作只有当vi置为责任控者时才有效。
5) 相关项:参见viPPoll()。
6) 实现要求:无。
4.17. viPPoll(vi,,result)
1) 目标:并行轮询GPIB器件
2) 参数表:
参数名 输入/输出方向 数据类型 描述
vi 输入 ViSession 对话通道标识符(句柄)
result 输出 ViPUInt8 结果地址
3) 返回状态值:
完成代码:
VI_SUCCESS 并行轮询完成
错误代码:
VI_ERROR_INV_SESSIONvi不能标识正当对话通道
VI_ERROR_TMO 超时错误
VI_ERROR_RSRC_LOCKED 存取锁定模式不支持特定操作
VI_ERROR_NCICvi不能置为责任控者
4) 描述:该操作只有当vi置为责任控者时才有效。
5) 相关项:参见viPPollConfig()。
6) 实现要求:无。
n VXI总线器件配置资源(VI_RSRC_VXI_DEV_CONF):
1. 资源概述:可实现VXI总线器件的初始化操作。
2. 资源属性表及属性描述:
属性名 描述
VI_ATTR_ASYNC_MODE_CNTRL 异步模式控制命令响应
VI_ATTR_CMDR_LA VXI总线控制器地址
VI_ATTR_DEV_CLASS VXI仪器类型
VI_ATTR_DEV_LA 器件地址
VI_ATTR_DEV_SUBCLASS 扩展型器件附加寄存器值
VI_ATTR_EXTDR_INFO 主机箱扩展器信息
VI_ATTR_MAINFRAME_LA 主机箱地址
VI_ATTR_MANF_ID VXI器件制造厂家标识符
VI_ATTR_MANF_NAME VXI器件制造厂家名
VI_ATTR_MEM_ATTR_REG 属性寄存器
VI_ATTR_MEM_BASE 内存基地址
VI_ATTR_MEM_SIZE 内存大小
VI_ATTR_MEM_SPACE 内存空间类型
VI_ATTR_MODEL_CODE 器件标号
VI_ATTR_MODEL_NAME 器件名
VI_ATTR_PASS_STATUS 器件自检通过状态
VI_ATTR_PROT_REG 消息基器件协议寄存器
VI_ATTR_PROT_RESP 读协议响应值
VI_ATTR_RDY_STATUS 器件就绪状态
VI_ATTR_RESP_EN 从机响应
VI_ATTR_SERV_AREA 从机空间大小
VI_ATTR_SERV_LIST 从机列表
VI_ATTR_SLOT 器件槽位号
VI_ATTR_SLOT0_LA 零槽器件地址
VI_ATTR_VXI_INTERRUPTERS 器件中断矢量
VI_ATTR_VXI_INTR_HNDLRS 中断处理矢量
3. VXI总线器件配置资源定义的事件如下所示:无
4. VXI总线器件配置资源定义的操作如下:
viAssertSoftReset(vi
4.1. viAssertSoftReset(vi
1) 目标:执行软件复位
2) 参数表:
参数名 输入/输出方向 数据类型 描述
vi 输入 ViSession 对话通道标识符(句柄)
3) 返回状态值:
完成代码:
VI_SUCCESS 软复位完成
VI_SUCCESS_DEV_FAILED 软复位完成,但器件无法通过自检
错误代码:
VI_ERROR_INV_SESSIONvi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED 存取锁定模式不支持特定操作
VI_ERROR_BERR 总线错误
4) 描述:该操作执行器件软件复位。
5) 相关项:无。
6) 实现要求:无。
n VXI总线接口控制资源(VI_RSRC_VXI_INTF):
1. 资源概述:用于配置VXI总线属性。
2. 资源属性表及属性描述:
属性名 描述
VI_ATTR_FAIR_RQST_TMO 公平请求超时值
VI_ATTR_HW_SOFTRESET_EN 硬件是否允许软复位
VI_ATTR_PHYS_ADDR 器件地址
VI_ATTR_RELS_MECH 总线释放机制
VI_ATTR_DEV_SUBCLASS 扩展型器件附加寄存器值
VI_ATTR_RQST_LEVEL 请求优先级
VI_ATTR_SYSFAIL_TMO SYSFAIL超时值
VI_ATTR_VXIBUS_TMO VXI总线超时值
VI_ATTR_VXI_INTR_STATUS 中断与信号位矢量
VI_ATTR_VXI_RETRY_EN 是否允许VXI总线背板重入
VI_ATTR_TRIG_STATUS 触发线位矢量
VI_ATTR_UTIL_BUS_STATUS 失败线位矢量
3. VXI总线接口控制资源定义的事件如下所示:
事件 说明
VI_EVENT_SOFTRESET 软复位引发事件
4. VXI总线接口控制资源定义的操作如下:无
n VXI零槽资源(VI_RSRC_VXI_SLOT_0):
1. 资源概述:描述VXI总线系统零槽功能。
2. 资源属性表及属性描述:
属性名 描述
VI_ATTR_ARBITRATION 总线仲裁模式
VI_ATTR_CLK10_LOCATION CLK10信号来源
VI_ATTR_CLK10_OPERATIONAL CLK10是否被操作
VI_ATTR_MODID VXI总线背板MODID线状态
VI_ATTR_PHSY_ADDR 器件地址
3. VXI总线接口控制资源定义的事件如下所示:无
4. VXI总线接口控制资源定义的操作如下:无
n VXI总线系统中断资源(VI_RSRC_VXI_SYS_INTR):
1. 资源概述:处理系统中断(ACFAIL、SYSFAIL与SYSRESET)。
2. 资源属性表及属性描述:
属性名 描述
VI_ATTR_HW_ACFAIL_EN 是否可以感知ACFAIL中断
VI_ATTR_HW_SYSFAIL_EN 是否可以感知SYSFAIL中断
VI_ATTR_HW_SYSRESET_EN 是否可以感知SYSRESET中断
3. VXI总线系统中断资源定义的事件如下所示:
事件 说明
VI_EVENT_ACFAIL ACFAIL系统中断事件
VI_EVENT_SYSFAIL SYSFAIL系统中断事件
VI_EVENT_SYSRESET SYSRESET系统中断事件
4. VXI总线系统中断资源定义的操作如下:
viAssertUtilBusSignal(vi,interrupt,mode)
4.1. viAssertUtilBusSignal(vi,interrupt,mode)
1) 目标:确认特定应用总线中断
2) 参数表:
参数名 输入/输出方向 数据类型 描述
vi 输入 ViSession 对话通道标识符(句柄)
interrupt 输入 ViUInt16 应用总线中断
mode 输入 ViUInt16 执行模式
3) 返回状态值:
完成代码:
VI_SUCCESS 应用总线中断确认完成
错误代码:
VI_ERROR_INV_SESSIONvi不能标识正当对话通道
VI_ERROR_NSUP_OPER 硬件不支持操作
VI_ERROR_RSRC_LOCKED 存取锁定模式不支持特定操作
VI_ERROR_INV_MODE 模式参数不合法
4) 描述:该操作可以确认三种系统中断,即为VI_ACFAIL、VI_SYSFAIL与VI_SYSRESET,其中mode参数只在VI_SYSRESET状态下有效,可分为VI_KEEP_CONFIG(不改变原来配置)、VI_NO_LOCAL_RESET(复位VXI电路但不复位当地CPU)及VI_RESET_LOCAL_CPU(复位当地CPU)。
5) 相关项:无。
6) 实现要求:无。
n VXI总线信号处理器资源(VI_RSRC_VXI_SIG_PROCESSOR):
1. 资源概述:提供器件之间中断及信号通讯接口。
2. 资源属性表及属性描述:
属性名 描述
VI_ATTR_ASYNC_MODE_CNTRL 异步模式控制命令响应
VI_ATTR_SIGP_MASK 信号处理器事件过滤器
VI_ATTR_SUGGESTED_INTR_ID 器件中断号
3. VXI总线信号处理器资源定义的事件如下所示:
事件 说明
VI_EVENT_SIGNALP VXI总线信号或中断引发事件
4. VXI总线信号处理器资源定义的操作如下:
viSendVXISignal(vi,StatusID)
4.1. viSendVXISignal(vi,StatusID)
1) 目标:确认中断或向信号寄存器的写操作
2) 参数表:
参数名 输入/输出方向 数据类型 描述
vi 输入 ViSession 对话通道标识符(句柄)
statusID 输入 ViUInt16 信号值
3) 返回状态值:
完成代码:
VI_SUCCESS 写操作完成
错误代码:
VI_ERROR_INV_SESSIONvi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED 存取锁定模式不支持特定操作
VI_ERROR_BERR 总线错误
4) 描述:该操作的写入模式为异步方式。
5) 相关项:无。
6) 实现要求:缺省状态为VXI总线信号。
n VXI总线信号资源(VI_RSRC_VXI_SIG):
1. 资源概述:监视送入当地控制器的信号。
2. 资源属性表及属性描述:
属性名 描述
VI_ATTR_HW_SIG_SENSE_EN 状态属性
VI_ATTR_SIG_RETRY_EN 在总线错误时进行信号重入
VI_ATTR_VXI_SIG_MASK 信号过滤屏蔽
3. VXI总线信号资源定义的事件如下所示:
事件 说明
VI_EVENT_SIGNAL 写入一当地信号寄存器引发事件
4. VXI总线信号资源定义的操作如下:无。
n VXI总线中断资源(VI_RSRC_VXI_INTR):
1. 资源概述:监视中断线状态。
2. 资源属性表及属性描述:
属性名 描述
VI_ATTR_HW_INTR_SENSE_EN 中断是否有效
VI_ATTR_INTR_ACK_MODE 中断响应模式
VI_ATTR_VXI_INTR_LINE 对应中断线
VI_ATTR_INTR_TYPE 中断类型
VI_ATTR_VXI_INTR_MASK 中断过滤屏蔽
3. VXI总线中断资源定义的事件如下所示:
事件 说明
VI_EVENT_VXI_INTR 中断引发事件
4. VXI总线中断资源定义的操作如下:
viAssertVXIInterrupt(vi,statusId)
viDeassertVXIInterrupt(vi
viAcknowledgeVXIInterrupt(vi,statusId)
4.1. viAssertVXIInterrupt(vi,StatusID)
1) 目标:确认中断线有效
2) 参数表:


参数名 输入/输出方向 数据类型 描述
vi 输入 ViSession 对话通道标识符(句柄)
statusID 输入 ViUInt32 状态值
3) 返回状态值:
完成代码:
VI_SUCCESS 中断确认完成
错误代码:
VI_ERROR_INV_SESSIONvi不能标识正当对话通道
VI_ERROR_NSUP_OPER 没有对应的中断器支持
VI_ERROR_RSRC_LOCKED 存取锁定模式不支持特定操作
VI_ERROR_INTR_PENDING VXI中断仍在登录
4) 描述:该操作确认VXI总线中断。
5) 相关项:无。
6) 实现要求:无。
4.2. viDeassertVXIInterrupt(vi
1) 目标:取消中断线确认
2) 参数表:
参数名 输入/输出方向 数据类型 描述
vi 输入 ViSession 对话通道标识符(句柄)
3) 返回状态值:
完成代码:
VI_SUCCESS 中断确认取消完成
错误代码:
VI_ERROR_INV_SESSIONvi不能标识正当对话通道
VI_ERROR_NSUP_OPER 没有对应的中断器支持
VI_ERROR_RSRC_LOCKED 存取锁定模式不支持特定操作
4) 描述:该操作只可用于调试目的。
5) 相关项:无。
6) 实现要求:无。
4.3. viAcknowledgeVXIInterrupt(vi,StatusID)
1) 目标:手动响应中断线
2) 参数表:
参数名 输入/输出方向 数据类型 描述
vi 输入 ViSession 对话通道标识符(句柄)
statusID 输出 ViPUInt32 状态值
3) 返回状态值:
完成代码:
VI_SUCCESS 中断线响应完成
错误代码:
VI_ERROR_INV_SESSIONvi不能标识正当对话通道
VI_ERROR_NSUP_OPER 没有对应的中断器支持
VI_ERROR_RSRC_LOCKED 存取锁定模式不支持特定操作
VI_ERROR_BERR 总线错误
4) 描述:该操作只能用于调试目的。
5) 相关项:无
6) 实现要求:无。
n VXI总线扩展接口资源(VI_RSRC_VXI_EXTDR):
1. 资源概述:实现VXI总线主机笨扩展信号的配置。
2. 资源属性表及属性描述:
属性名 描述
VI_ATTR_ECL_TRIG_P2 扩展器件P2 ECL触发器是否有效
VI_ATTR_ECL_TRIG_P3 扩展器件P3 ECL触发器是否有效
VI_ATTR_INTR_DIR 中断级方向
VI_ATTR_INTR_LEVELS_EN 中断级是否有效
VI_ATTR_TRIG_DIR ECL/TTL触发线方向
VI_ATTR_TTL_TRIG_P2 扩展器件P2 TTL触发器是否有效
VI_ATTR_UTIL_BUS_DIR 应用总线方向
3. VXI总线扩展接口资源定义的事件如下所示:无
4. VXI总线扩展接口资源定义的操作如下:无
n 异步串行总线接口控制资源(VI_RSRC_ASRL_INTF):
1. 资源概述:进行异步串行接口存取操作。
2. 资源属性表及属性描述:
属性名 描述
VI_ATTR_ASRL_BAUD 波特率
VI_ATTR_ASRL_DATA_BITS 数据位
VI_ATTR_ASRL_PARITY 检验极性
VI_ATTR_ASRL_STOP_BITS 停止位
VI_ATTR_ASRL_FLOW_CNTRL 数据流控制
VI_ATTR_ASRL_FLOW_IN 数据输入流
VI_ATTR_ASRL_FLOW_OUT 数据输出流
VI_ATTR_ASRL_ON_LIMIT 数据输入流允许
VI_ATTR_ASRL_OFF_LIMIT 数据输入流不允许
VI_ATTR_ASRL_XON_CHAR 开启流控制
VI_ATTR_ASRL_XOFF_CHAR 关闭流控制
VI_ATTR_ASRL_IN_BUF_SIZE 接收缓冲区大小
VI_ATTR_ASRL_AVAIL_NUM 接收缓冲区字节个数
VI_ATTR_ASRL_LOCAL_ECHO 是否对每个字符都响应
VI_ATTR_ASRL_RTS_STATE RTS信号状态
VI_ATTR_ASRL_CTS_STATE CTS信号状态
VI_ATTR_ASRL_DTR_STATE DTR信号状态
VI_ATTR_ASRL_DSR_STATE DSR信号状态
VI_ATTR_ASRL_DCD_STATE DCD信号状态
VI_ATTR_ASRL_RI_STATE RI信号状态
VI_ATTR_ASRL_BUS_STATE 所有总线信号状态
VI_ATTR_ASRL_ON_PARITY 极性校验有效
VI_ATTR_ASRL_ON_FRAMING 帧校验有效
VI_ATTR_ASRL_REPLACE_CHAR 输入字符替代字符
VI_ATTR_ASRL_DISCARD_NULL 空字符是否需要丢弃
VI_ATTR_TMO_UNIT 超时值单位
VI_ATTR_TMO 超时值
VI_ATTR_ASRL_ABORT_DCD 当DCD无效时是否需要退出
VI_ATTR_ASRL_ABORT_PARITY 极性校验错误是否需要退出
VI_ATTR_ASRL_END_IN 读操作终止方式
VI_ATTR_ASRL_TERMCHAR 终止符
VI_ATTR_ASRL_END_OUT 写操作终止方式
VI_ATTR_ASRL_END_OUT_CHAR 写操作终止符
3. 异步串行总线接口控制资源定义的事件如下所示:
事件 说明
VI_EVENT_IO_COMPLETION 异步读写操作完成
VI_EVENT_ASRL_DATA_AVAIL 接收缓冲区已有N个字符
VI_EVENT_ASRL_STRING_ARRIVED 接收缓冲区接收到特定字符
VI_EVENT_ASRL_END_ARRIVED 接收缓冲区接收到END字符
VI_EVENT_ASRL_FLOWIN_CHANGED 输入流控制方式改变
VI_EVENT_ASRL_FLOWOUT 输出流控制方式改变
_CHANGED
VI_EVENT_ASRL_RTS_CHANGED RTS状态改变
VI_EVENT_ASRL_CTS_CHANGED CTS状态改变
VI_EVENT_ASRL_DSR_CHANGED DSR状态改变
VI_EVENT_ASRL_DTR_CHANGED DTR状态改变
VI_EVENT_ASRL_DCD_CHANGED DCD状态改变
VI_EVENT_ASRL_RI_CHANGED RI状态改变
VI_EVENT_ASRL_RING RI输入信号沿被检测到
VI_EVENT_ASRL_PARITY_ERR 极性校验错误引发事件
VI_EVENT_ASRL_FRAMING_ERR 帧校验错误引发事件
VI_EVENT_ASRL_OVERRUN_ERR 超限错误
VI_EVENT_ASRL_OVERFLOW_ERR 溢出错误
4. 异步串行总线接口控制资源定义的操作如下:
viAsrlRead(vibufcountretCount
viAsrcReadAsync(vibufcount,jobId)
viAsrcReadStatus(vi,jobId,status)
viAsrcWrite(vibufcountretCount
viAsrcWriteAsync(vibufcount,jobId)
viAsrcWriteStatus(vi,jobId,status)
viAsrcSendBreak(vi,unit,length)
4.1. viAsrlRead(vibufcountretCount
1) 目标:从异步串行总线同步读取数据
2) 参数表:与viRead()一致。
3) 返回状态值:
完成代码:
VI_SUCCESS 传送完成
VI_SUCCESS_TERM_CHAR 特定终止符被读取
VI_SUCCESS_MAX_CNT 读取的字节数与count数相同
错误代码:
VI_ERROR_INV_SESSIONvi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED 存取锁定模式不支持特定操作
VI_ERROR_TMO 超时错误
VI_ERROR_ABORT 传送时用户退出
VI_ERROR_ASRL_NO_DCD DCD无效
VI_ERROR_ASRL_PARITY 极性校验错误
VI_ERROR_ASRL_FRAMING 帧校验错误
VI_ERROR_ASRL_OVERRUN 超限错误
VI_ERROR_ASRL_OVERFLOW 溢出错误
4) 描述:该操作将从器件中读取的值放在buf
5) 相关项:参见viAsrlReadAsync()、viAsrlReadStatus()。
6) 实现要求:无
4.2. viAsrlReadAsync(vibufcount,jobId)
1) 目标:从异步串行总线异步读取数据
2) 参数表:与viReadAsync()一致。
3) 返回状态值:
完成代码:
VI_SUCCESS 传送完成
错误代码:
VI_ERROR_INV_SESSIONvi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED 存取锁定模式不支持特定操作
VI_ERROR_QUEUE_ERROR 不能进行异步操作排队
4) 描述:该操作将从器件中读取的值放在buf
5) 相关项:参见viAsrlRead()、viAsrlReadStatus()。
6) 实现要求:无
4.3. viAsrlReadStatus(vi,jobId,jobStatus)
1) 目标:获取异步串行总线读操作状态
2) 参数表:与viReadStatus()一致。
3) 返回状态值:
完成代码:
VI_SUCCESS 状态获取完成
错误代码:
VI_ERROR_INV_SESSIONvi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED 存取锁定模式不支持特定操作
VI_ERROR_INV_JOBID 作业标识符不当
4) 描述:当操作为同步时,标识符唯一确定,为VI_SYNC;当操作为异步时,标识符为操作的输出参数值。
5) 相关项:参见viAsrlReadAsync()、viAsrlRead()。
6) 实现要求:无。
4.4. viAsrlWrite(vibufcountretCount
1) 目标:将数据同步写入到异步串行总线中
2) 参数表:与viWrite()一致。
3) 返回状态值:
完成代码:
VI_SUCCESS 传送完成
错误代码:
VI_ERROR_INV_SESSIONvi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED 存取锁定模式不支持特定操作
VI_ERROR_TMO 超时错误
VI_ERROR_ABORT 传送时用户退出
VI_ERROR_ASRL_NO_DCD DCD信号无效
4) 描述:该操作将位于buf中的数据写入到异步串行总线中去。
5) 相关项:参见viAsrlWriteAsync()、viAsrlWriteStatus()。
6) 实现要求:无。
4.5. viAsrlWriteAsync(vibufcount,jobId)
1) 目标:将数据异步写入到异步串行总线中。
2) 参数表:与viWriteAsync()一致
3) 返回状态值:
完成代码:
VI_SUCCESS 异步写操作完成
错误代码:
VI_ERROR_INV_SESSIONvi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED 存取锁定模式不支持特定操作
VI_ERROR_QUEUE_ERROR 不能进行写操作排队
4) 描述:该操作将位于buf中的数据写入到异步串行总线中去。
5) 相关项:参见viAsrlWrite()、viAsrlWriteStatus()。
6) 实现要求:无。
4.6. viAsrlWriteStatus(vi,jobId,jobStatus)
1) 目标:获取异步串行写操作状态
2) 参数表:与viWriteStatus()一致。
3) 返回状态值:
完成代码:
VI_SUCCESS 状态获取完成
错误代码:
VI_ERROR_INV_SESSIONvi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED 存取锁定模式不支持特定操作
VI_ERROR_INV_JOBID 作业标识符不当
4) 描述:当操作为同步时,标识符唯一确定,为VI_SYNC;当操作为异步时,标识符为操作的输出参数值。
5) 相关项:参见viAsrlWrite()、viAsrlWriteAsync()。
6) 实现要求:无。
4.7. viAsrlSendBreak(vi,unit,length)
1) 目标:发送时间间隔
2) 参数表:
参数名 输入/输出方向 数据类型 描述
vi 输入 ViSession 资源对话通道标识符
unit 输入 ViUint16 间隔时间单位,可取:VI_PICO_SEC(皮秒)、VI_NANO_
SEC
(纳秒)、VI_MICRO_SEC(微秒)、VI_MILLI_SEC(毫秒)、VI_SEC(秒)、
VI_ASRL_FRAME_TIME
length 输入 ViUInt32 间隔时间长度
3) 返回状态值:
完成代码:
VI_SUCCESS 间隔发送完成
错误代码:
VI_ERROR_INV_SESSIONvi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED 存取锁定模式不支持特定操作
VI_ERROR_ABORT 传送时用户退出
4) 描述:该操作向异步串行接口发送一个间隔,数据传送中保持的时间间隔可以为一帧或更长。
5) 相关项:无。
6) 实现要求:无。

3.4 VISA的软件实现
在前一节中,详细给出了VISA资源定义规范,但事实上,前一节中描述的VISA资源所含的属性、事件与操作在目前还没有能够完全实现,它只为一个统一的、开放的I/O接口软件库定义了一个标准规范与目标。目前真正已经用软件实现了的只是VISA规范定义的一个子集,无论是资源属性、事件与操作均只包含规范定义的一部
分,并且软件实现的一部分函数定义与VISA规范定义也不完全相同。

目前,世界上只有HP公司与NI公司推出了自己的VISA软件,下面介绍的是HP公司的VISA软件(当前版本为Version1.1)所包含的VISA资源属性、事件与操作,这是虚拟仪器设计人员进行虚拟仪器驱动程序开发的真正基础与参考文本。下面也分别按资源类给出相应的属性表、事件表与操作表。
属性表:
1、VISA资源模板:
VI_ATTR_MAX_QUEUE_LENGTH 任一时间特定对话通道最大事件排队长度
VI_ATTR_RM_SESSION 资源管理器对话通道
VI_ATTR_RSRC_IMPL_VERSION 资源版本
VI_ATTR_RSRC_LOCK_STATE 资源存取锁定模式(取值为表中所列三种)
VI_ATTR_RSRC_MANF_ID 生产厂家标号
VI_ATTR_RSRC_MANF_NAME 生产厂家名
VI_ATTR_RSRC_NAME 资源名
VI_ATTR_RSRC_SPEC_VERSION VISA规范版本
VI_ATTR_USER_DATA 资源特定对话通道所用的私有数据
2、仪器控制资源:
通用仪器控制属性:
VI_ATTR_INTF_TYPE 对话通道接口类型
VI_ATTR_INTF_NUM 接口板号
VI_ATTR_IO_PROT I/O协议
VI_ATTR_RD_BUF_OPER_MODE 读缓冲区操作模式
VI_ATTR_SEND_END_EN 最后一个字节是否有END字符
VI_ATTR_SUPPRESS_END_EN 是否禁止END字符
VI_ATTR_TERMCHAR 终止符
VI_ATTR_TERMCHAR_EN 是否允许终止符
VI_ATTR_TMO_VALUE 超时值
VI_ATTR_TRIG_ID 当前触发机制
VI_ATTR_WR_BUF_OPER_MODE 写缓冲区操作模式
GPIB仪器控制属性:
VI_ATTR_GPIB_PRIMARY_ADDR GPIB主地址
VI_ATTR_GPIB_SECONDARY GPIB副地址
_ADDR
VI_ATTR_INTF_PAERNT_NUM GPIB板号
VXI仪器控制属性:
VI_ATTR_MAINFRAME_LA 主机箱地址
VI_ATTR_MANF_ID VXI器件制造厂家标识符
VI_ATTR_MEM_BASE 内存基地址
VI_ATTR_MEM_SIZE 内存大小
VI_ATTR_MEM_SPACE 内存空间类型
VI_ATTR_MODEL_CODE 器件标号
VI_ATTR_SLOT VXI器件槽位
VI_ATTR_VXI_LA VXI器件逻辑地址
VI_ATTR_CMDR_LA VXI总线控制器地址
VI_ATTR_IMMEDIATE_SERV 是否为立即从者
VI_ATTR_FDC_CHNL FDC数据传送通道
VI_ATTR_FDC_GEN_SIGNAL_EN 是否允许通过FDC传送数据
VI_ATTR_FDC_MODE FDC模式
VI_ATTR_FDC_USE_PAIR 一对或一个FDC有效
VI_ATTR_SRC_INCREMENT 源偏移量
VI_ATTR_DEST_INCREMENT 目标偏移量
VI_ATTR_WIN_ACCESS 当前窗存取模式
VI_ATTR_WIN_BASE_ADDR 总线基地址
VI_ATTR_WIN_SIZE 当前窗长度
异步串行仪器控制属性:
VI_ATTR_ASRL_AVAIL_NUM 接收缓冲区字节个数
VI_ATTR_ASRL_BAUD 波特率
VI_ATTR_ASRL_DATA_BITS 数据位
VI_ATTR_ASRL_END_IN 读操作终止方式
VI_ATTR_ASRL_END_OUT 写操作终止方式
VI_ATTR_ASRL_FLOW_CNTRL 数据流控制
VI_ATTR_ASRL_PARITY 检验极性
VI_ATTR_ASRL_STOP_BITS 停止位
VI_ATTR_DEST_INCREMENT 目标偏移量
VI_ATTR_FDC_CHNL FDC数据传送通道
VI_ATTR_FDC_GEN_SIGNAL_EN 是否允许通过FDC传送数据
VI_ATTR_FDC_MODE FDC模式
VI_ATTR_FDC_USE_PAIR 一对或一个FDC有效
对于属性的操作,一般用viSetAttribute(ViSession/ViEvent/ViFindListvi, ViAttr attribute, ViAttrState attrState)及viGetAttribute(ViSession/ViEvent/ViFindListvi, ViAttr attribute, ViPAttrState attrState)来进行属性设置与获取,属性的主体可以是器件句柄类型、事件类型、资源对象类型等,应该分情况对待。如例3.6与例3.7的事件中断子程序中的属性主体即为事件类型。

事件表:
VI_EVENT_SERVICE_REQ 服务请求通知事件
VI_EVENT_VXI_SIGP VXI总线信号或中断引发事件
VI_EVENT_TRIG 硬件触发产生
VI_EVENT_IO_COMPLETION 异步I/O操作已完成
事件处理方式分事件排队方式与事件回调方式,具体见例3.4~例3.7。

操作表:
1、VISA资源模板:
viClose(vi):关闭特定的对话通道。
viGetAttribute(vi,attribute,attrState):获取资源属性状态值。
viSetAttribute(vi,attribute,attrState):设置资源属性状态值。
viStatusDesc(vi,status,desc):获取返回状态描述字符串。
viTerminate(vi,degree,jobId):请求VISA资源终止一个或所有对话通道的正常运行。
viLock(vi,lockType,timeout,requestId,accessKey):设置资源存取模式。
viUnlock(vi):取消资源存取模式。
viEnableEvent(vi,eventType,mechanism,context):允许特定事件通知。
viDisableEvent(vi,eventType,mechanism):不允许特定事件通知。
viDiscardEvents(vi,eventType,mechanism):刷新一个对话通道上事件发生。
viWaitOnEvent(vi,ineventTypeList,timeout,outEventType,outContext):等待特定事件的发生。
viInstallHandler(vi,eventType,handler,userHandle):安装回调事件句柄。
viUnInstallHandler(vi,eventType,handler,userHandle):卸载回调事件句柄。
2、VISA资源管理器:
viOpenDefaultRM(sesn):打开缺省资源管理器资源对话通道。
viOpen(sesn,rsrcname,accessMode,timeout,vi):打开特定资源的对话通道。
viFindRsrc(sesn,expr,findList,retcnt,instrDesc):查询VISA系统进行资源定位。
viFindNext(findList,instrDesc):返回前一个查询操作查得的资源。
3、仪器控制管理:
viRead(vibufcountretCount):从器件同步读取数据。
viReadAsync(vibufcount,jobId):从器件异步读取数据。
viWritevibufcountretCount):将数据同步写入到器件中。
viWriteAsync(vibufcount,jobId):将数据异步写入到器件中。
viAssertTrigger(vi,protocol):用特定协议确认硬件或软件触发。
viReadSTB(vi,status):读取服务请求状态字节。
viClear(vi):清除器件。
viSetBuf(vi,mask,size):设置格式化I/O缓冲区大小。
viFlush(vi,mask):手动刷新格式化I/O缓冲区。
viPrintf(vi,writeFmt,arg1,arg2…):按设定格式将数据传送到器件中。
viVPrintf(vi,writeFmt,params):按设定格式将数据传送到器件中。
viScanf(vi,readFmt,arg1,arg2…):按设定格式从器件中读取数据。
viVScanf(vi,readFmt,params):按设定格式从器件中读取数据。
viQuery(vi,writeFmt,readFmt,arg1,arg2…):按设定格式对器件进行数据读写。
viVQuery(vi,writeFmt,readFmt,params):按设定格式对器件进行数据读写。
viIn8(vi,space,offset,value):从接口总线读取8位(字节)单位。
viIn16(vi,space,offset,value):从接口总线读取16位(字)单位数据。
viIn32(vi,space,offset,value):从接口总线读取32位(双字)单位数据。

viOut8(vi,space,offset,value):向接口总线写入8位(字节)单位数据。
viOut16(vi,space,offset,value):向接口总线写入16位(字)单位数据。
viOut32(vi,space,offset,value):向接口总线写入32位(双字)单位数据。


viMoveIn8(vi,space,offset,length,buf8):从器件存储器向当地存储器移动8位(字节)单位数据。
viMoveIn16(vi,space,offset,length,buf8):从器件存储器向当地存储器移动16位(字)单位数据。
viMoveIn32(vi,space,offset,length,buf8):从器件存储器向当地存储器移动32位(双字)单位数据。
viMoveOut8(vi,space,offset,length,buf8):从当地存储器向器件存储器移动8位(字节)单位数据。
viMoveOut16(vi,space,offset,length,buf8):从当地存储器向器件存储器移动16位(字)单位数据。
viMoveOut32(vi,space,offset,length,buf8):从当地存储器向器件存储器移动32位(双字)单位数据。
viMapAddress(vi,mapSpace,mapBase,mapSize,access,suggested,address):映射内存空间。
viUnMapAddress(vi):取消内存映射。
viPeek8(vi,addr,val8):从特定地址读8位数据。
viPeek16(vi,addr,val16):从特定地址读16位数据。
viPeek32(vi,addr,val32):从特定地址读32位数据。
viPoke8(vi,addr,val8):向特定地址写8位数据。
viPoke16(vi,addr,val16):向特定地址写16位数据。
viPoke32(vi,addr,val32):向特定地址写32位数据。
viMemAlloc(vi,size,offset):从器件存储器分配内存。
viMemFree(vi,offset):释放内存分配。
在VISA1.1中定义的操作函数列,只是VISA规范的一小部分,但有一些操作函数并没有在VISA规范中定义过,属于软件本身补充定义的,如打开资源管理器函数viOpenDefaultRM()函数在仪器系统初始化时进行调用,建立仪器系统资源管理器与VISA软件的关联;viStatusDesc()函数在VISA函数调用返回后调用,并将前一个VISA函数调用返回值作为输入参数,获取字符串形式的状态描述;viFindNext()函数是viFindRsrc()函数的补充,用于查寻VISA系统资源;viMemAlloc()函数与viMemFree()函数用于器件存储器内存操作。而对于VISA规范中的VISA仪器控制组织器资源与VISA特定接口仪器控制资源定义的操作,VISA1.1中均没有定义,这也为VISA软件今后的发展提供了方向。可以看到,应用VISA1.1函数,可以实现仪器系统基本编程要求,但对于特定的操作,尚需要进一
步扩充,VISA软件本身是一个不断完善与发展的产物。如果要修改与开发VISA软件,必须遵循VISA规范,并基于VISA模型进行开发。

目前世界上,生产VXI仪器模块、机箱及应用程序等的生产厂家与设计单位层出不穷,但是,将VISA正式作为产品推出的只有HP公司与NI公司,它们一直从VTL(VISA过渡库)到版本1.1,也均只实现了VISA规范定义中的一部分函数。从理论上说,VISA软件应该不能由生产厂家提供,而是应该作为标准库为所有仪器生产厂家与集成单位所共享,但事实上由于商业等因素,VISA软件也同样被作为一个独立的产品提供,并依靠它的基础性与统一性,各自为HP公司和NI公司占领自动测试领域市场,作为一个市场竞争强有力的装器。况且,这两家推出的VISA软件之间也不尽兼容,安装了HP公司的VISA软件,再去安装NI公司的相关软件,计算机系统往往会给出警告提示,严重时会导致整个系统的崩溃。可以这么说,VISA软件的开发与硬件零槽控制模块的开发技术作为商业秘密垄断在国外少家几家公司手中,会成为我国产业真正实现自主化的障碍,剖析VISA软件的实质并进行自主的开发,是今后的
研究重点。

目前,我国有些研究单位与生产厂家也开始在探索零槽控制模块的研制开发工作,并形成了一些产品,但大部分还是采用了GPIB—VXI接口模式,市场性价比并不高,对于VISA软件的开发,由于是一种基础性的研究,资金、人员、精力投入量大,产出的效益并不直接,因此各单位也并没有轻易入手。在本书的讨论中,也并没有包括VISA软件的开发,而只作为知识的延伸进行讨论,希望今后可以在这方面得到进一步的条件进行开发研制工作。

VISA软件的开发,应基于自底向上的模型结构展开,先定义一个资源模板的子集,
如资源开启、资源寻找、资源属性操作、资源关闭等函数,在这些函数设计中,重点是对于输入参数分析,并在程序中加以多情况散转处理。然后,在资源模板基础上,定义一个VISA资源管理器,包括资源管理器操作与特定资源的查询,这部分函数集主要完成对仪器系统控制器的交互操作。下一步,定义出仪器控制函数集,主要包括读能、写功能、格式化I/O功能、触发功能、状态/服务请求功能、器件存取功能等,这些操作属于器件基本共有性操作,在函数实现时也同时必须进行分情况散转处理。而其它一些属于特定仪器特有的操作,可以列出另外一个函数子集,进行特定器件的控制与操作。这几部分函数子集组合成一个完整的函数集,即VISA软件函数库。以上所述的仅是基本的设计思路,具体的开发工作应结合系统控制器的开发一起进行。

符合VPP规范的虚拟仪器驱动程序的开发,一般要求底层I/O接口软件调用VISA函数,但有些应用程序的设计跳过虚拟仪器驱动程序的间接调用而直接调用VISA函数,同样也是可以的,只是程序模块化不够清晰。另外,虚拟仪器系统软件结构中的I/O接口软件并不一定只限于VISA软件,它只是一个最优选择而并非唯一,事实上Windows中的API也承担着计算机系统的I/O接口软件的作用,对于计算机资源的操作,也可以通过直接调用API函数实现,这种模式同样符合扩展了的虚拟仪器系统框架。从本质上说,虚拟仪器系统软件结构的实质是为了实现对最终用户的方便易用,而并不一定拘泥于具体形式。

附录3.1:visatype.h文件
/*----------------------------------------------*/
/* 由VXI即插即用系统联盟提供 */
/*标题:VISATYPE.H */
/*目标:提供VISA基本数据类型及宏定义 */
/*---------------------------------------------*/

#ifndef __VISATYPE_HEADER__
#define __VISATYPE_HEADER__

#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32__) ||
defined(__NT__)) && !defined(_NI_mswin16_)
#define _VI_FAR
#define _VI_FUNC __stdcall
#define _VI_FUNCC __cdecl
#define _VI_FUNCH __stdcall
#define _VI_SIGNED signed
#elif defined(_CVI_) && defined(_NI_i386_)
#define _VI_FAR
#define _VI_FUNC _pascal
#define _VI_FUNCC
#define _VI_FUNCH _pascal
#define _VI_SIGNED signed
#elif (defined(_WINDOWS) || defined(_Windows)) &&
!defined(_NI_mswin16_)
#define _VI_FAR _far
#define _VI_FUNC _far _pascal _export
#define _VI_FUNCC _far _cdecl _export
#define _VI_FUNCH _far _pascal
#define _VI_SIGNED signed
#elif (defined(hpux) || defined(__hpux)) && (defined(__cplusplus) ||
defined(__cplusplus__))
#define _VI_FAR
#define _VI_FUNC
#define _VI_FUNCC
#define _VI_FUNCH
#define _VI_SIGNED
#else
#define _VI_FAR
#define _VI_FUNC
#define _VI_FUNCC
#define _VI_FUNCH
#define _VI_SIGNED signed
#endif

#define _VI_ERROR (-2147483647L-1) /* 0x80000000 */
#define _VI_PTR _VI_FAR *

/*- VISA数据类型
--------------------------------------------------------------*/
typedef unsigned long ViUInt32;
typedef ViUInt32 _VI_PTR ViPUInt32;
typedef ViUInt32 _VI_PTR ViAUInt32;

typedef _VI_SIGNED long ViInt32;
typedef ViInt32 _VI_PTR ViPInt32;
typedef ViInt32 _VI_PTR ViAInt32;

typedef unsigned short ViUInt16;

typedef ViUInt16 _VI_PTR ViPUInt16;
typedef ViUInt16 _VI_PTR ViAUInt16;

typedef _VI_SIGNED short ViInt16;
typedef ViInt16 _VI_PTR ViPInt16;
typedef ViInt16 _VI_PTR ViAInt16;

typedef unsigned char ViUInt8;
typedef ViUInt8 _VI_PTR ViPUInt8;
typedef ViUInt8 _VI_PTR ViAUInt8;

typedef _VI_SIGNED char ViInt8;
typedef ViInt8 _VI_PTR ViPInt8;
typedef ViInt8 _VI_PTR ViAInt8;

typedef char ViChar;
typedef ViChar _VI_PTR ViPChar;
typedef ViChar _VI_PTR ViAChar;

typedef unsigned char ViByte;
typedef ViByte _VI_PTR ViPByte;
typedef ViByte _VI_PTR ViAByte;

typedef void _VI_PTR ViAddr;
typedef ViAddr _VI_PTR ViPAddr;
typedef ViAddr _VI_PTR ViAAddr;

typedef float ViReal32;
typedef ViReal32 _VI_PTR ViPReal32;
typedef ViReal32 _VI_PTR ViAReal32;

typedef double ViReal64;
typedef ViReal64 _VI_PTR ViPReal64;
typedef ViReal64 _VI_PTR ViAReal64;

typedef ViPByte ViBuf;
typedef ViPByte ViPBuf;
typedef ViPByte _VI_PTR ViABuf;

typedef ViPChar ViString;
typedef ViPChar ViPString;
typedef ViPChar _VI_PTR ViAString;

typedef ViString ViRsrc;
typedef ViString ViPRsrc;
typedef ViString _VI_PTR ViARsrc;

typedef ViUInt16 ViBoolean;
typedef ViBoolean _VI_PTR ViPBoolean;
typedef ViBoolean _VI_PTR ViABoolean;

typedef ViInt32 ViStatus;
typedef ViStatus _VI_PTR ViPStatus;
typedef ViStatus _VI_PTR ViAStatus;

typedef ViUInt32 ViVersion;
typedef ViVersion _VI_PTR ViPVersion;
typedef ViVersion _VI_PTR ViAVersion;

typedef ViUInt32 ViObject;
typedef ViObject _VI_PTR ViPObject;
typedef ViObject _VI_PTR ViAObject;

typedef ViObject ViSession;
typedef ViSession _VI_PTR ViPSession;
typedef ViSession _VI_PTR ViASession;

/*- 完成代码 ----------------------------------------------*/
#defineVI_SUCCESS (0L)

/*- 其它VISA定义 ----------------------------------------------*/
#defineVI_NULL (0)
#defineVI_TRUE (1)
#defineVI_FALSE (0)

/*- 宏定义
-------------------------------------------------------------*/
#define VISAFN _VI_FUNC
#define ViPtr _VI_PTR
#endif

/*- 结束--------------------------------------------*/




附录3.2:visa.h文件
/*-----------------------------------------------*/
/* 由VXI即插即用系统联盟提供 */
/*标题:VISA.H */
/*目标:VISA数据类型、属性、事件及操作定义 */
/*----------------------------------------------*/

#ifndef __VISA_HEADER__
#define __VISA_HEADER__

#include <stdarg.h>
#include "visatype.h"

#defineVI_SPEC_VERSION (0x00100100L)

#if defined(__cplusplus) || defined(__cplusplus__)
extern "C" {
#endif

#if defined(_CVI_)
#pragma EnableLibraryRuntimeChecking
#endif

/*- VISA数据类型
-----------------------------------------------------------*/
typedef ViObject ViEvent;
typedef ViEvent _VI_PTR ViPEvent;
typedef ViObject ViFindList;
typedef ViFindList _VI_PTR ViPFindList;
typedef ViUInt32 ViEventType;
typedef ViEventType _VI_PTR ViPEventType;
typedef ViUInt32 ViAttrState;
typedef void _VI_PTR ViPAttrState;
typedef ViString ViKeyId;
typedef ViPString ViPKeyId;
typedef ViUInt32 ViJobId;
typedef ViJobId _VI_PTR ViPJobId;
typedef ViUInt32 ViAccessMode;
typedef ViUInt32 ViBusAddress;
typedef ViBusAddress _VI_PTR ViPBusAddress;
typedef ViUInt32 ViBusSize;
typedef ViUInt32 ViAttr;
typedef ViUInt32 ViEventFilter;
typedef va_list ViVAList;
typedef ViStatus (_VI_FUNCH _VI_PTR ViHndlr)
(ViSessionvi, ViEventType eventType, ViEvent event, ViAddr
userHandle);

/*- 资源管理器功能-----------------------------------------*/
#if (defined(__MWERKS__) && defined(__MC68K__)) || (defined(__SC__) &&
defined(__CFM68K__))
#pragma lib_export on
#endif

ViStatus _VI_FUNC viOpenDefaultRM (ViPSessionvi);
#define viGetDefaultRM(vi) viOpenDefaultRM(vi)
ViStatus _VI_FUNC viFindRsrc(ViSession sesn, ViString expr, ViPFindList
vi,
ViPUInt32 retCnt, ViChar _VI_FAR desc[]);
ViStatus _VI_FUNC viFindNext(ViFindListvi, ViChar _VI_FAR desc[]);
ViStatus _VI_FUNC viOpen(ViSession sesn, ViRsrc name, ViAccessMode
mode,
ViUInt32 timeout, ViPSessionvi);

/*- 资源模板功能----------------------------------------------------*/
ViStatus _VI_FUNC viClose(ViObjectvi);
ViStatus _VI_FUNC viSetAttribute (ViObjectvi, ViAttr attrName, ViAttrState attrValue);
ViStatus _VI_FUNC viGetAttribute(ViObjectvi, ViAttr attrName, void _VI_PTR attrValue);
ViStatus _VI_FUNC viStatusDesc (ViObjectvi, ViStatus status, ViChar _VI_FAR desc[]);
ViStatus _VI_FUNC viTerminate(ViObjectvi, ViUInt16 degree, ViJobId jobId);
ViStatus _VI_FUNC viLock (ViSessionvi, ViAccessMode lockType, ViUInt32
timeout, ViKeyId requestedKey, ViChar
_VI_FAR accessKey[]);
ViStatus _VI_FUNC viUnlock(ViSessionvi);
ViStatus _VI_FUNC viEnableEvent(ViSessionvi, ViEventType eventType,

ViUInt16 mechanism, ViEventFilter context);
ViStatus _VI_FUNC viDisableEvent(ViSessionvi, ViEventType eventType, ViUInt16 mechanism);
ViStatus _VI_FUNC viDiscardEvents (ViSessionvi, ViEventType eventType,ViUInt16 mechanism);
ViStatus _VI_FUNC viWaitOnEvent (ViSessionvi, ViEventType
inEventType, ViUInt32 timeout, ViPEventType outEventType, ViPEvent
outContext);
ViStatus _VI_FUNC viInstallHandler(ViSessionvi, ViEventType eventType,ViHndlr handler, ViAddr userHandle);
ViStatus _VI_FUNC viUninstallHandler(ViSessionvi, ViEventType eventType, ViHndlr handler, ViAddr userHandle);

/*- 基本I/O操作---------------------------------------------------*/
ViStatus _VI_FUNC viRead(ViSessionvi, ViPBufbuf, ViUInt32 cnt, ViPUInt32 retCnt);
ViStatus _VI_FUNC viReadAsync(ViSessionvi, ViPBufbuf, ViUInt32 cnt, ViPJobId jobId);
ViStatus _VI_FUNCviWrite(ViSessionvi, ViBufbuf, ViUInt32 cnt, ViPUInt32 retCnt);
ViStatus _VI_FUNC viWriteAsync(ViSessionvi, ViBufbuf, ViUInt32 cnt, ViPJobId jobId);
ViStatus _VI_FUNC viAssertTrigger (ViSessionvi, ViUInt16 protocol);
ViStatus _VI_FUNC viReadSTB(ViSessionvi, ViPUInt16 status);
ViStatus _VI_FUNC viClear(ViSessionvi);

/*- 格式化I/O操作-----------------------------------------------*/
ViStatus _VI_FUNC viSetBuf (ViSessionvi, ViUInt16 mask, ViUInt32 size);
ViStatus _VI_FUNC viFlush (ViSessionvi, ViUInt16 mask);
ViStatus _VI_FUNCC viPrintf (ViSessionvi, ViString writeFmt, ...);
ViStatus _VI_FUNC viVPrintf(ViSessionvi, ViString writeFmt, ViVAList params);
ViStatus _VI_FUNCC viScanf (ViSessionvi, ViString readFmt, ...);
ViStatus _VI_FUNC viVScanf(ViSessionvi, ViString readFmt, ViVAList params);
ViStatus _VI_FUNCC viQueryf(ViSessionvi, ViString writeFmt, ViString readFmt, ...);
ViStatus _VI_FUNC viVQueryf(ViSessionvi, ViString writeFmt, ViString readFmt,ViVAList params);

/*- 存储器 I/O操作
---------------------------------------------------*/
ViStatus_VI_FUNC viIn8(ViSessionvi, ViUInt16 space,ViBusAddress offset, ViPUInt8 val8);
ViStatus _VI_FUNC viOut8(ViSessionvi, ViUInt16 space,ViBusAddress offset, ViUInt8 val8);
ViStatus _VI_FUNC viIn16(ViSessionvi, ViUInt16 space,ViBusAddress offset, ViPUInt16 val16);
ViStatus _VI_FUNC viOut16(ViSessionvi, ViUInt16 space,ViBusAddress offset, ViUInt16 val16);
ViStatus _VI_FUNC viIn32(ViSessionvi, ViUInt16 space,ViBusAddress offset, ViPUInt32 val32);
ViStatus _VI_FUNC viOut32(ViSessionvi, ViUInt16 space,ViBusAddress offset, ViUInt32 val32);
ViStatus _VI_FUNC viMoveIn8(ViSessionvi, ViUInt16 space, ViBusAddress offset, ViBusSize length, ViAUInt8buf8);
ViStatus _VI_FUNC viMoveOut8 (ViSessionvi, ViUInt16 space, ViBusAddress offset,ViBusSize length, ViAUInt8buf8);
ViStatus _VI_FUNC viMoveIn16(ViSessionvi, ViUInt16 space, ViBusAddressoffset,ViBusSize length, ViAUInt16buf16);
ViStatus _VI_FUNC viMoveOut16 (ViSessionvi, ViUInt16 space, ViBusAddress offset, ViBusSize length, ViAUInt16buf16);
ViStatus _VI_FUNC viMoveIn32 (ViSessionvi, ViUInt16 space, ViBusAddress offset,ViBusSize length, ViAUInt32buf32);
ViStatus _VI_FUNC viMoveOut32(ViSessionvi, ViUInt16 space, ViBusAddress offset, ViBusSize length, ViAUInt32buf32);
ViStatus _VI_FUNC viMove(ViSessionvi, ViUInt16 srcSpace, ViBusAddress srcOffset, ViUInt16 srcWidth, ViUInt16 destSpace, ViBusAddress destOffset, ViUInt16 destWidth, ViBusSize srcLength);
ViStatus _VI_FUNC viMoveAsync(ViSessionvi, ViUInt16 srcSpace, ViBusAddress srcOffset, ViUInt16 srcWidth, ViUInt16 destSpace, ViBusAddress estOffset, ViUInt16 destWidth, ViBusSize srcLength, ViPJobId jobId);
ViStatus _VI_FUNC viMapAddress(ViSessionvi, ViUInt16 mapSpace, ViBusAddress mapOffset, ViBusSize mapSize, ViBoolean access,ViAddr suggested, ViPAddr address);
ViStatus _VI_FUNC viUnmapAddress (ViSessionvi);
void _VI_FUNC viPeek8 (ViSessionvi, ViAddr address, ViPUInt8
val8);
void _VI_FUNC viPoke8 (ViSessionvi, ViAddr address, ViUInt8 val8);
void _VI_FUNC viPeek16 (ViSessionvi, ViAddr address, ViPUInt16 val16);
void _VI_FUNC viPoke16 (ViSessionvi, ViAddr address, ViUInt16 val16);
void _VI_FUNC viPeek32 (ViSessionvi, ViAddr address, ViPUInt32 val32);
void _VI_FUNC viPoke32 (ViSessionvi, ViAddr address, ViUInt32 val32);

/*- 共享内存操作 ------------------------------------------------*/
ViStatus _VI_FUNC viMemAlloc(ViSessionvi, ViBusSize size, ViPBusAddress offset);
ViStatus _VI_FUNC viMemFree (ViSessionvi, ViBusAddress offset);

#if (defined(__MWERKS__) && defined(__MC68K__)) || (defined(__SC__) &&
defined(__CFM68K__))
#pragma lib_export off
#endif

/*- 属性
--------------------------------------------------------------*/
#defineVI_ATTR_RSRC_NAME (0xBFFF0002L)
#defineVI_ATTR_RSRC_IMPL_VERSION (0x3FFF0003L)
#defineVI_ATTR_RSRC_LOCK_STATE (0x3FFF0004L)
#defineVI_ATTR_MAX_QUEUE_LENGTH (0x3FFF0005L)
#defineVI_ATTR_USER_DATA (0x3FFF0007L)
#defineVI_ATTR_FDC_CHNL (0x3FFF000DL)
#defineVI_ATTR_FDC_MODE (0x3FFF000FL)
#defineVI_ATTR_FDC_GEN_SIGNAL_EN (0x3FFF0011L)
#defineVI_ATTR_FDC_USE_PAIR (0x3FFF0013L)
#defineVI_ATTR_SEND_END_EN (0x3FFF0016L)
#defineVI_ATTR_TERMCHAR (0x3FFF0018L)
#defineVI_ATTR_TMO_VALUE (0x3FFF001AL)
#defineVI_ATTR_GPIB_READDR_EN (0x3FFF001BL)
#defineVI_ATTR_IO_PROT (0x3FFF001CL)
#defineVI_ATTR_ASRL_BAUD (0x3FFF0021L)
#defineVI_ATTR_ASRL_DATA_BITS (0x3FFF0022L)
#defineVI_ATTR_ASRL_PARITY (0x3FFF0023L)
#defineVI_ATTR_ASRL_STOP_BITS (0x3FFF0024L)
#defineVI_ATTR_ASRL_FLOW_CNTRL (0x3FFF0025L)
#defineVI_ATTR_RD_BUF_OPER_MODE (0x3FFF002AL)
#defineVI_ATTR_WR_BUF_OPER_MODE (0x3FFF002DL)
#defineVI_ATTR_SUPPRESS_END_EN (0x3FFF0036L)
#defineVI_ATTR_TERMCHAR_EN (0x3FFF0038L)
#defineVI_ATTR_DEST_ACCESS_PRIV (0x3FFF0039L)
#defineVI_ATTR_DEST_BYTE_ORDER (0x3FFF003AL)
#defineVI_ATTR_SRC_ACCESS_PRIV (0x3FFF003CL)
#defineVI_ATTR_SRC_BYTE_ORDER (0x3FFF003DL)
#defineVI_ATTR_SRC_INCREMENT (0x3FFF0040L)
#defineVI_ATTR_DEST_INCREMENT (0x3FFF0041L)
#defineVI_ATTR_WIN_ACCESS_PRIV (0x3FFF0045L)
#defineVI_ATTR_WIN_BYTE_ORDER (0x3FFF0047L)
#defineVI_ATTR_CMDR_LA (0x3FFF006BL)
#defineVI_ATTR_MAINFRAME_LA (0x3FFF0070L)
#defineVI_ATTR_WIN_BASE_ADDR (0x3FFF0098L)
#defineVI_ATTR_WIN_SIZE (0x3FFF009AL)
#defineVI_ATTR_ASRL_AVAIL_NUM (0x3FFF00ACL)
#defineVI_ATTR_MEM_BASE (0x3FFF00ADL)
#defineVI_ATTR_ASRL_CTS_STATE (0x3FFF00AEL)
#defineVI_ATTR_ASRL_DCD_STATE (0x3FFF00AFL)
#defineVI_ATTR_ASRL_DSR_STATE (0x3FFF00B1L)
#defineVI_ATTR_ASRL_DTR_STATE (0x3FFF00B2L)
#defineVI_ATTR_ASRL_END_IN (0x3FFF00B3L)
#defineVI_ATTR_ASRL_END_OUT (0x3FFF00B4L)
#defineVI_ATTR_ASRL_RI_STATE (0x3FFF00BFL)
#defineVI_ATTR_ASRL_RTS_STATE (0x3FFF00C0L)
#defineVI_ATTR_WIN_ACCESS (0x3FFF00C3L)
#defineVI_ATTR_RM_SESSION (0x3FFF00C4L)
#defineVI_ATTR_VXI_LA (0x3FFF00D5L)
#defineVI_ATTR_MANF_ID (0x3FFF00D9L)
#defineVI_ATTR_MEM_SIZE (0x3FFF00DDL)
#defineVI_ATTR_MEM_SPACE (0x3FFF00DEL)
#defineVI_ATTR_MODEL_CODE (0x3FFF00DFL)
#defineVI_ATTR_SLOT (0x3FFF00E8L)
#defineVI_ATTR_INTF_INST_NAME (0xBFFF00E9L)
#defineVI_ATTR_IMMEDIATE_SERV (0x3FFF0

相关文章:

  • android 中.9图片的用法 详解
  • 女生应该找一个玩ACM的男生
  • 应用界面主题Theme使用方法
  • 参数声明中的静态数组索引:一个不错且鲜为人知的C语言特性
  • 远程服务化的思路整理
  • Android游戏框架AndEngine使用入门
  • 好的程序员应该第一时间去Google
  • 短信技术的几个基本概念
  • log4j:WARN No appenders could be found for logger
  • gbs使用手册之配置文件
  • gbs使用手册之gbs build
  • gbs使用手册之gbs chroot
  • 如何用doxygen生成文档
  • FreeMarker教程
  • Timer、TimerTask实现定时业务处理
  • 分享的文章《人生如棋》
  • __proto__ 和 prototype的关系
  • 【刷算法】求1+2+3+...+n
  • Facebook AccountKit 接入的坑点
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • Hexo+码云+git快速搭建免费的静态Blog
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • iOS 系统授权开发
  • js写一个简单的选项卡
  • node 版本过低
  • Puppeteer:浏览器控制器
  • SOFAMosn配置模型
  • Yii源码解读-服务定位器(Service Locator)
  • 编写符合Python风格的对象
  • 番外篇1:在Windows环境下安装JDK
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 扑朔迷离的属性和特性【彻底弄清】
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 使用parted解决大于2T的磁盘分区
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 我有几个粽子,和一个故事
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • Semaphore
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • #Java第九次作业--输入输出流和文件操作
  • #控制台大学课堂点名问题_课堂随机点名
  • (26)4.7 字符函数和字符串函数
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (转)【Hibernate总结系列】使用举例
  • (转)visual stdio 书签功能介绍
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .NET Core 和 .NET Framework 中的 MEF2
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .Net的C#语言取月份数值对应的MonthName值
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • @Import注解详解