基于QT的USB应用-仪器设备上位机开发和visa库应用

基于USB的Qt-Creator的开发

1.1 usb的库下载

本文章的usb的库来自github的上面的开源库:libusb。这个需要在使用的操作系统的环境中手动编译。

如果你是在window使用,可以下载已经编译好的库:连接在这里

1.2 加载库

这里QT-Creator 创建工程,就不介绍了。首先需要创建一个qt工程。
然后根据电脑的需要复制前面下载的库。

笔者这里复制:libusb-MinGW-x64文件夹到工程下面。可以看到三个文件夹,分别是bin、include和lib,其中bin中放着动态链接库,lib中放的是静态链接库,include中放的是头文件
在这里插入图片描述

然后在pro里面添加库和头文件。(这里为了方便操作,重新对之前库文件进行重新命名,改成:libusb.a)

win32: LIBS +=  -L$$PWD/new_test/libusb_MinGW_x64/lib/ -llibusb
INCLUDEPATH +=  $$PWD/new_test/libusb_MinGW_x64/include
DEPENDPATH +=  $$PWD/new_test/libusb_MinGW_x64/include

1.3 代码编写

1.3.1 新建一个对话框

界面

1.3.2 头文件

#ifndef DIALOGTEST1_H
#define DIALOGTEST1_H

#include <QDialog>
#include "libusb.h"

#define Vendor_Id 0x1AB1
#define Product_Id 0x0643

namespace Ui {
class Dialogtest;
}

class Dialogtest : public QDialog
{
    Q_OBJECT
public:
    explicit Dialogtest(QWidget *parent = nullptr);
    ~Dialogtest();
    void ScanDev(void);  // 扫描设备
private slots:
   void on_ScanBtn_clicked();

private:
    Ui::Dialogtest *ui;
    libusb_device **devs;    // usb获取所有设备
    libusb_device *product_dev;      // 扫描指定id的设备句柄
    uint32_t   product_num;  // 产品扫描到usb的编号
};

#endif // DIALOGTEST1_H

1.3.3 源文件

#include "dialogtest1.h"
#include "ui_dialogtest1.h"
#include "libusb.h"
#include <QDebug>
#include <QMessageBox>



Dialogtest::Dialogtest(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialogtest)
{
     ui->setupUi(this);
    int r = libusb_init(nullptr);    // 初始化usb,
    int cnt=0;


    if(r < 0)  // 无usb设备
    {
        // 取消警告
        QMessageBox::warning(this,tr("警告"),tr("搜索不到usb"),QMessageBox::Abort);
        // 调整显示内容
        this->close();
    }
    else
    {
        // 获取连接设备
        cnt = libusb_get_device_list(NULL,&devs);
        if(cnt < 0)  // 没有连接任何设备
        {
            // 取消警告
            QMessageBox::warning(this,tr("警告"),tr("没有连接设备"),QMessageBox::Abort);
            // 调整显示内容
             this->close();
        }
        else
        {

            product_dev=nullptr;
            product_num=0;
            ScanDev();   // 扫描设备
        }
    }

}

Dialogtest::~Dialogtest()
{
    libusb_free_device_list(devs,true);
    libusb_exit(NULL);
    delete ui;
}

void Dialogtest::ScanDev()
{
    libusb_device *dev;
    int i = 0;
//    int j = 0;
//    uint8_t path[8];
    while((dev = devs[i++]) != NULL)   // 检查每个usb的句柄
    {
        struct libusb_device_descriptor desc;
        int r = libusb_get_device_descriptor(dev,&desc);
        if(r < 0)
        {
            qDebug() << "failed to get device descriptor.";
            break;
        }
        qDebug("%04x:%04x (bus %d, device %d)",desc.idVendor,desc.idProduct,
                libusb_get_bus_number(dev),libusb_get_device_address(dev));
        if(desc.idVendor==Vendor_Id && desc.idProduct==Product_Id)   //对比,找到合适的供应商和设备
        {
            product_dev=dev;   //保存设备编号
            product_num=i;
            break;
        }
    }
    if(product_dev==nullptr)   //没有合适的设备;
    {
         QMessageBox::warning(this,tr("警告"),tr("没有连接设备"),QMessageBox::Abort);
         ui->labelCom->setText("没有连接");
         libusb_free_device_list(devs,true);
    }
    else
    {
         ui->labelCom->setText("连接正常");

    }
}

void Dialogtest::on_ScanBtn_clicked()
{
    libusb_get_device_list(NULL,&devs);  // 重新扫描
    product_dev=nullptr;
    product_num=0;
    ScanDev();   // 扫描设备

1.4 代码测试

1.4.1 没有插入设备

在这里插入图片描述

1.4.2 插入设备安定重新搜索

在这里插入图片描述

1.5 总结

ubs操作很容易,只要按照步骤,就可以很容易成功加载成功。 使用对应usbapi就可以按照example里面的顺序,依次应用对应的函数。

2 VISA 库

NI-VISA(Virtual Instrument Software Architec-ture,以下简称为“VISA”)是美国国家仪器NI(NationalInstrument)公司开发的一种用来与各种仪器总线进行通信的高级应用编程接口。VISA总线I/O软件是一个综合软件包,不受平台、总线和环境的限制,可用来对USB、GPIB、串口、VXI、PXI和以太网系统进行配置、编程和调试。VISA是虚拟仪器系统I/ O接口软件。基于自底向上结构模型的VISA创造了一个统一形式的I/ O控制函数集。一方面,对初学者或是简单任务的设计者来说,VISA提供了简单易用的控制函数集,在应用形式上相当简单;另一方面,对复杂系统的组建者来说,VISA提供了非常强大的仪器控制功能与资源管理。

2.1 仪器仪表

很多仪器仪表公司的上位机的仪器通讯采用VISA库。譬如普源精电科技股份有限公司的DG800 系列函数/任意波形发生器。它支持USB通讯,通过VISA库建立连接。
远程可以控制仪器。

2.2 VISA库

2.2 1 下载VISA库

附件中是window应用的VISA库,需要可以直接下载

2.2.2 加载库

win32: LIBS += -L$$PWD/log4qt/bin/ -llog4qt   \
               -L$$PWD/new_test/libusb_MinGW_x64/lib/ -llibusb \
               -L$$PWD/new_test/visa/Lib_x64/msc -lvisa64
INCLUDEPATH += $$PWD/log4qt   \
               $$PWD/new_test/libusb_MinGW_x64/include \
               $$PWD/new_test/visa/Include
DEPENDPATH += $$PWD/log4qt    \
              $$PWD/new_test/libusb_MinGW_x64/include  \
              $$PWD/new_test/visa/Include

2.2.4 驱动编写

仪器信息写入,上位机发送信息给仪器。


bool InstrWrite(QString strAddr, QString strContent,QWidget *pDialog)
{
    ViSession defaultRM,instr;
    ViStatus status;
    ViUInt32 retCount;
    std::string SendBuf ;
    std::string SendAddr ;
    bool bWriteOK = false;
   // QString str;

    //Change the address's data style from CString to char*
    SendAddr=strAddr.toStdString();
    //Change the command's data style from CString to char*

     SendBuf=strContent.toStdString();
    //open the VISA instrument
    status = viOpenDefaultRM(&defaultRM);
    if (status < VI_SUCCESS)
    {
        QMessageBox::warning(pDialog,QObject::tr("警告"),QObject::tr("No VISA instrument was opened !"),QMessageBox::Abort);

        return false;
    }

    viOpen(defaultRM,(char *)SendAddr.c_str(), VI_NULL, VI_NULL, &instr);
     //write command to the instrument
    viWrite(instr, (unsigned char *)SendBuf.c_str(), SendBuf.size(), &retCount);
    //close the instrument
    viClose(instr);
    viClose(defaultRM);
    return bWriteOK;
}

仪器信息读取。读取仪器发送的消息。

bool InstrRead(QString strAddr, QString *pstrResult,QWidget *pDialog)
{
    ViSession defaultRM,instr;
    ViStatus status;
    ViUInt32 retCount;
    std::string SendAddr ;
    unsigned char RecBuf[MAX_REC_SIZE];
    bool bReadOK = false;


    //Change the address's data style from CString to char*
    SendAddr = strAddr.toStdString();
    memset(RecBuf,0,MAX_REC_SIZE);
    //open the VISA instrument
    status = viOpenDefaultRM(&defaultRM);
    if (status < VI_SUCCESS)
    {
    // Error Initializing VISA...exiting
        QMessageBox::warning(pDialog,QObject::tr("警告"),QObject::tr("No VISA instrument was opened !"),QMessageBox::Abort);
        return false;
    }
    //open the instrument
     viOpen(defaultRM,(char *)SendAddr.c_str(), VI_NULL, VI_NULL, &instr);
    //read from the instrument
     viRead(instr, RecBuf, MAX_REC_SIZE, &retCount);
    //close the instrument
    viClose(instr);
    viClose(defaultRM);


    *pstrResult=pstrResult->QString::fromLocal8Bit((char *)RecBuf);  // 把char 型转化成为

    return bReadOK;
}

控制输出正弦波

	case 0: res=pVisaDev->OnSend(this,":SOUR1:FUNC SIN");      if(res==false) break;
    case 1: res=pVisaDev->OnSend(this,":SOUR1:FREQ 2000");     if(res==false) break;
    case 2: res=pVisaDev->OnSend(this,":SOUR1:VOLT 2");        if(res==false) break;
    case 3: res=pVisaDev->OnSend(this,":SOUR1:VOLT:OFFS 0");   if(res==false) break;
    case 4: res=pVisaDev->OnSend(this,":SOUR1:PHAS 0");        if(res==false) break;
    case 5: res=pVisaDev->OnSend(this,":OUTP1 ON");            if(res==false) break;

3 总结

通过以上操作,就可以控制仪器。后面只需要设计好图形界面就可以。主意好逻辑。
在这里插入图片描述

  • 7
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
QT5是一种流行的跨平台应用程序开发框架,usbcan-2e-u是一种USB接口的CAN总线通信设备。上位机开发是指基于上位机计算机进行软件开发,用于与其他设备通信、控制、数据处理等应用QT5提供了丰富的图形界面和多媒体功能,使得上位机软件开发变得更加简单和高效。通过使用QT5编写的软件可以实现与usbcan-2e-u设备的连接和通信。开发者可以利用QT5的API和功能来实现CAN总线数据的读取、写入、解析和显示等操作。 在进行QT5 USBCAN-2E-U上位机开发时,首先需要了解usbcan-2e-u设备的功能和特性,包括其USB接口、CAN总线通信协议及数据格式等。然后,使用QT5的开发工具来创建桌面应用程序项目,并添加必要的界面组件和控件。通过编写数据交互的代码,实现与usbcan-2e-u设备的连接和通信。 对于CAN总线数据的读取,可以使用usbcan-2e-u提供的API接口进行调用,通过连接到的设备来读取CAN总线上的数据帧。读取的数据可以通过QT5的界面进行显示和处理,可以使用图表、表格等控件来展示CAN总线数据的实时变化。 对于CAN总线数据的写入,需要根据需要设置CAN总线的波特率、ID和数据信息等,并通过usbcan-2e-u设备将数据帧发送到CAN总线上。 在QT5 USBCAN-2E-U上位机开发过程中,还可以加入其他的功能模块,如数据记录、数据分析、参数设置等,以满足不同应用场景的需要。 总之,QT5 USBCAN-2E-U上位机开发可以通过QT5框架和usbcan-2e-u设备的API接口进行实现,其具体的开发步骤包括了解设备功能、创建项目、编写代码、连接设备、操作数据等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HHONGQI123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值