Qt用tcpsocket向E4440A频谱仪发送命令遇到的问题

Qt用tcpsocket向E4440A频谱仪发送命令遇到的问题

问题1:官方使用手册中的命令不能用

比如使用手册获取Y的值是使用:CALC:PST:MARK1:Y?
在这里插入图片描述
我们用这个命令测试根本没有返回值,在网上搜相关文档,使用:CALC:MARK1:Y?才能正确获取Y值。其实使用手册里很多例出来的命令都不能直接用。
我找到的可以使用的命令文档如下:
链接: 安捷伦34970、53220、特尔斯特FSH4、普源DSA800常用采集测量仪器介绍与控制

链接: python操作频谱仪(是德科技N9030B)

问题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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值