QT 与日置、安捷伦测试仪 通讯 232串口 GPIB

记录一下经验

一、232串口通讯 日置仪表

   232串口通讯比较简单,自带的QSerialPort就可以识别。

1.包含头文件。

#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>

2.扫描串口并输出串口信息,当然,如果你知道串口名可以直接打开。

foreach( const QSerialPortInfo &Info,QSerialPortInfo::availablePorts())//读取串口信息
        {   
            //调试时可以看的串口信息
            qDebug() << "portName    :"  << Info.portName();
            qDebug() << "Description   :" << Info.description();
            qDebug() << "Manufacturer:" << Info.manufacturer();
            QSerialPort serial;
            serial.setPort(Info);
            if( serial.open( QIODevice::ReadWrite) )//如果串口是可以读写方式打开的
            {
                serial.close();//然后自动关闭等待人为打开
            }
         }

3.打开串口设置参数。

void Mwidget::portOpen()
{

    //对串口进行一些初始化
        my_serialPort = new QSerialPort(this);
        my_serialPort->setPortName("COM1");//电脑232串口标识,一般串口旁边就能看到
        //不确定可以扫描所有串口再判断
        if(my_serialPort->open( QIODevice::ReadWrite))
        {
            qDebug()<<"portOpen";
        }
        my_serialPort->setBaudRate(9600);//波特率
        my_serialPort->setDataBits( QSerialPort::Data8 );//数据字节,8字节
        my_serialPort->setParity( QSerialPort::NoParity );//校验,无
        my_serialPort->setFlowControl( QSerialPort::NoFlowControl );//数据流控制,无
       // 链接日置仪表时用的QSerialPort::HardWareControl
        my_serialPort->setStopBits( QSerialPort::OneStop );//一位停止位
       //监听串口,收到数据就执行run函数
        QObject::connect(my_serialPort, &QSerialPort::readyRead, this, &Mwidget::run);    
}

4.串口读写

读。这里读取的数据可能不完整,需要根据结束标识符拼接一下。

QString read()
{
    QByteArray buf= my_serialPort->readAll();
    QString mess ;
    return mess.prepend(buf);
 }

void write(QString message)
{
    message+='\r';message+='\n';//插入换行
    QString Data =message.toUtf8();//转换成utf8格式的字节流发送
    my_serialPort->write(Data);//串口对象my-serialPort
}

5.记得关闭串口

serialPort->clear();
serialPort->close();

二 GPIB通信 安捷伦仪表

1.准备

连接电脑的话需要一根GPIB-USB转接线(其实是板卡),用的KEYSIGHT 82357bB

驱动安装,有光驱的话用自带的光盘安装(里面还有有一个GPIB调试工具)

或者IVI合规包

2.引入库文件

函数头文件位置

C:\Program Files (x86)\IVI Foundation\VISA\WinNT\Include

库文件位置

C:\Program Files (x86)\IVI Foundation\VISA\WinNT\lib\msc\agvisa32.lib

建议将WinNT文件复制到项目文件夹下,便于发布

在pro文件中添加,当然不使用$$PWD的话,直接添加上面文件位置

win32 
{
    INCLUDEPATH += $$PWD/WinNT/Include

    LIBS += $$PWD/WinNT/lib/msc/agvisa32.lib
}

网上众多版本是引入visa32.lib这个库,我这边测试连不上,浪费挺多时间,后来换成agvisa32.lib就解决了。

3.添加头文件

#include <visa.h>

4.查找资源

   //定义几个变量

char instrDescriptor[VI_FIND_BUFLEN];//仪表设备描述
ViUInt32 numInstrs;//仪表设备数量
ViFindList findList;//仪表设备列表
ViSession defaultRM, instr;//资源,仪表设备标识符
ViStatus status;//状态
ViString expr = ViString("?*INSTR");//正则表达式

   其中正则表达式

  1. GPIB           "GPIB[0-9]*::?*INSTR"

  2. VXI             "VXI?*INSTR"

  3. GPIB-VXI    "GPIB-VXI?*INSTR"

  4. Any VXI      "?*VXI[0-9]*::?*INSTR"

  5. Serial          "ASRL[0-9]*::?*INSTR"

  6. PXI              "PXI?*INSTR"

  7. All instruments    "?*INSTR"           //所有仪表设备

  8. All resources       "?*"                     //所有资源

//打开资源管理器,staus为状态值,0代表没有错误

    status = viOpenDefaultRM(&defaultRM);  
    if(status<VI_SUCCESS)
    {
        qDebug()<<"打开失败";
    }

   //查找仪器设备,返回值为instrDescriptor,打开设备时用来区分

statusinit = viFindRsrc(defaultRM,expr, &findList, &numInstrs, instrDescriptor);
    if(statusinit<VI_SUCCESS)
    {
        qDebug()<<"发生错误";
        viClose (defaultRM);
    }
    else
    {
        while(numInstrs>0)//输出所有仪器设备描述
        {
            qDebug()<<instrDescriptor;
            viFindNext(findList,instrDescriptor);//查找下一个仪器设备
            --numInstrs;
        }

    }

5.打开仪器设备,返回值 instr,代表 GPIB1::1::INSTR 这个仪器


       QString name = "GPIB1::1::INSTR";
       QByteArray bytearr = name1.toUtf8();
       strcpy(instrDescriptor,bytearr.data());
       statusinit=viOpen(defaultRM,instrDescriptor, VI_NULL, VI_NULL, &instr);
       if(statusinit<VI_SUCCESS)
         {
           qDebug()<<"设备打开失败"<<instr;
           qDebug()<<statusinit;
         }
       else
         {
            qDebug()<<"设备打开成功"<<instr<<instrDescriptor;
         }

6.读写命令

void writeGpib(ViSession ses,QString message)
{
    char*  charr;
    message+='\r';message+='\n';
    QByteArray bytearr = message.toUtf8();
    charr=bytearr.data();
    char stringinput[512];
    strcpy(stringinput,charr);
    qDebug()<<ses;
    ViStatus status = viWrite(ses,(ViBuf)stringinput,(ViUInt32)strlen(stringinput),(ViPUInt32)stringinput);
    if(status<VI_SUCCESS)
    {
        qDebug()<<"写入错误"<<ses<<message;
    }
    else
    {
        qDebug()<<"写入设备"<<ses<<message;
    }
}

查询

QByteArray queryGpib(ViSession ses,QString message)
{
    writeGpib(ses,message);
    unsigned char buffer[100];
    ViUInt32 retcount;
    ViStatus status = viRead(ses,buffer,100,&retcount);
    //读取instr内容,retcount为实际内容长度
    if(status<VI_SUCCESS)
    {
       qDebug()<<"查询失败";
       qDebug()<<status;
       return 0;
    }
    else
    {
        qDebug()<<"查询成功";
        qDebug()<<QByteArray((char*)buffer,retcount);
        return QByteArray((char*)buffer,retcount);
    }
}

查询有个单独函数

viqueryf()

但是读取数据不完整,又懒得拼接。viRead可以读取完整数据,就用读写封装了一下。

7.关闭

viClose(资源);

如有疑问见例子

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值