Java通过JNA调用VISA32,控制频谱仪,
发送“*CAL?”命令(仪器校准,时间较长,大概10秒左右)后,
使用viRead方法读取结果超时,结果的描述是:timeout occurred
debug后,发现viRead方法憋两秒就返回了~~
搜索后,得知可以设置超时时间。 --------------------------------------------------------------- result = viRead(ViSession vi, ViPBuf buf, ViUInt32 count, ViPUInt32 retCount);
viRead是同步执行的方法,直到满足以下某个条件才会返回: <1>超时 <2>接收到希望的字节数 <3>接收到终结字符或END指示符
参数retCount将被设置为实际返回的字节数,可以用来判断是否有数据返回。 函数返回值,可以用来判断是否超时。 ------------------------------------------------------------------- Why do I Receive Timeout Error -1073807339 on VISA Read or Write? http://digital.ni.com/public.nsf/allkb/874B379E24C0A0D686256FCF007A6EA0?OpenDocument
超时属性 VI_ATTR_TMO_VALUE 默认是2000毫秒。 可以使用viSetAttribute方法设置该属性,如下修改为15秒。
viSetAttribute( vi, VI_ATTR_TMO_VALUE, 15000);
设置超时时间后,影响该session中的所有read和write方法。 那么,只要在需要较长的命令前执行该语句即可, 执行完再修改为默认的两秒。
设置终结字符的方法: vs = viSetAttribute( vi, VI_ATTR_TERMCHAR, 0x0A); vs = viSetAttribute( vi, VI_ATTR_TERMCHAR_EN, VI_TRUE);
|