CVI大神帮帮忙,TCP仪器通信问题
//用户名设置
errvi->error=viRead (vi, c, 4,retCount); //c=80000009
errvi->error=viRead (vi,d, 9, retCount); //d=”username”
WT3000Write(errvi,"anonymous",&Acknowledge,&DataLength);
//密码设置
errvi->error=viRead (vi, c, 4, retCount); //c=80000009
errvi->error=viRead (vi,d, 9, retCount); //d=”password”
WT3000Write(errvi,"",&Acknowledge,&DataLength);
//电压量程设置
errvi->error=viRead (vi, c, 4,retCount); //c=80000014
errvi->error=viRead (vi,d, 20,retCount); //d=”clt serveris ready.”
WT3000Write(errvi,":VOLT:MODE:ALLRMS;:VOLT:AUTO OFF;:VOLT:RANG:ALL1000V;",&Acknowledge,&DataLength);
void WT3000Write(struct errorvi*errvi1,char WriteDate[],int*Acknowledge,int*DataLength)
{
int changdu=0;
int b=0x0;
char c[20]="";
int result=0;
char bchar[200]="";
if(SkipWhiteSpace (WriteDate)==NULL)
{
changdu=0;
}
else
{
changdu=strlen(WriteDate);
}
*DataLength=changdu; //9
b=0x80000000|changdu; //0x80000009
bchar[0]=(b>>24)&0x00ff;
bchar[1]=(b>>16)&0x00ff;
bchar[2]=(b>>8)&0x00ff;
bchar[3]=b&0x00ff;
strcat(bchar+4,WriteDate);
errvi1->error=viWrite (vi, bchar, 200, retCount);
//Delay(5);
errvi1->error=viRead (vi, c, 4, retCount); //返回指令放在c中
}
采用Labwindows与可编程功率测试仪WT3000 TCP通信,其中WT3000Write中将要发送的内容与内容的长度连接起来通过viWrite写入,然后立即读回一个返回指令。在用户名设置和密码设置中都能够成功返回指令80000000,在电压量程设置中的程序死在WT3000Write里面的visa read:Timeout expired before operation completed.理论上也应该收到返回指令80000000,但是总是收不着,,改变超时时间、改变viWrite与viRead之间的时间间隔好像都不起作用。
检查errvi1->error=viWrite (vi, bchar, 200, retCount);语句中的retCount是否为200,或者是否等于你发送字符串的长度,如果不是,说明参数配置没有正确完成,仪器可能错误响应下面的viread()函数。建议对所有函数执行后的retCount进行检查,viWrite()和viRead()函数好象还有一个传入参数,即错误代码,根据错误代码可以查找函数的错误信息。
所有的retCount都返回NULL,我的电压量程的:VOLT:MODE:ALLRMS;:VOLT:AUTO OFF;:VOLT:RANG:ALL1000V;是可以设置仪器的量程,说明viWrite (vi, bchar, 200, retCount);发挥作用啦,但是执行errvi1->error=viRead (vi, c, 4, retCount)总是出现超时错误;现在想要解决的是超时的问题。
麻烦大神了,我现在困惑的很,能否可以告知QQ号码呢,想仔细咨询下,谢啦
读之前可以判断一下当前缓冲中的字节数,然后再读。另外手册中是否有介绍写完VOLD:MODE....之后,仪器就立即返回数据呢,是不是还需要别的命令。可以找一个tcp调试助手软件调试一下。read超时的原因就是一直等到读取的字节数达到设置的字节数时,才返回,否则有可能timeout.
查了一下,这个问题还不是很简单就能解决的,建议还是寻求YOKOGAWA的技术支持吧。