记录一下经验
一、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");//正则表达式
其中正则表达式
-
GPIB "GPIB[0-9]*::?*INSTR"
-
VXI "VXI?*INSTR"
-
GPIB-VXI "GPIB-VXI?*INSTR"
-
Any VXI "?*VXI[0-9]*::?*INSTR"
-
Serial "ASRL[0-9]*::?*INSTR"
-
PXI "PXI?*INSTR"
-
All instruments "?*INSTR" //所有仪表设备
-
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(资源);
如有疑问见例子。