Qt用tcpsocket向E4440A频谱仪发送命令遇到的问题
问题1:官方使用手册中的命令不能用
比如使用手册获取Y的值是使用:CALC:PST:MARK1:Y?
我们用这个命令测试根本没有返回值,在网上搜相关文档,使用:CALC:MARK1:Y?才能正确获取Y值。其实使用手册里很多例出来的命令都不能直接用。
我找到的可以使用的命令文档如下:
链接: 安捷伦34970、53220、特尔斯特FSH4、普源DSA800常用采集测量仪器介绍与控制
问题2:使用tcpsocket的write()函数向频谱仪写多条命令,数据获取不正确。
我需要让频谱仪
1.改变中心频率,
2.Maker改成中心频率,
3.再获取marker值
每条命令单独发都能让频谱仪正常调整,但是将这三条语句带入代码里面就不行了。最先我想的是,可能命令发送太快,导致频谱仪反应不过来,所以添加了线程休眠,但是无济于事,代码如下:
if(tcpsocket!=nullptr){
QString zhongxinpinglv="SENS:FREQ:CENT ";
zhongxinpinglv.append(str1).append("MHz\n");
tcpsocket->write(zhongxinpinglv.toUtf8());
std::this_thread::sleep_for(std::chrono::seconds(2));//线程休眠1s钟
QString makerpl="CALC:MARK1:X";
makerpl.append(" ").append(str1).append("MHz\n");
tcpsocket->write(makerpl.toUtf8());
std::this_thread::sleep_for(std::chrono::seconds(2));//线程休眠1s钟
tcpsocket->write("CALC:MARK1:Y?\n");
QString str = QString::asprintf("%.2lf", readData);
ui->textBrowser->append("获得Y值:"+str);
}else {
ui->textBrowser->append("没有建立连接");
}
由于没有频谱仪,我自己写了个接收命令的接收端,发现连续使用三个write函数,tcpsocket会先缓存,然后把三条命令一起发出去。
这时怀疑一起发送,导致数据获取异常。于是就得找到命令写一条,发一条发的方式,经过多方查找,可以使用tcpsocket->flush()这个函数,强制将缓冲区中的数据发送出去。
QString zhongxinpinglv="SENS:FREQ:CENT ";
zhongxinpinglv.append(cell->readValue().toString()).append("MHz\n");
tcpsocket->write(zhongxinpinglv.toUtf8());
tcpsocket->flush();//使用write()后直接使用flush(),就能将刚才写入的发送出去。
但是国庆在家没有频谱仪,所以至于能不能正确获取marker的Y值还有待各位加班的小伙伴考证😁。
问题3:从服务端发送过来的marker,只有第一次接收数据能触发ReadyRead()函数
多方查找原因是接收也有缓冲区,解决方法为把缓冲区字节数变小。
但是在此期间,询问了我的同事,真实原因是单线程造成的,一个线程发送数据,一个线程用于接收数据才行。
于是乎开始学习多线程ing