基于QT5.1.0实现USBCAN-E-U的CAN数据读取开发

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

最近在学习QT界面开发,想做一个基于周立功CAN盒的上位机软件。对QT实现USBCAN-E-U板卡CAN数据收发进行探索。

一、开发环境

系统:win7
QT:5.1.0
QT Creator:2.7.2
编译器:_MinGW_32bit

CAN硬件:ZLG USBCAN-E-U

二、开发步骤

1.准备对应CAN通信卡的驱动包、二次开发库文件

驱动及库下载链接
根据自己的ZLG硬件板卡选择对应的驱动和二次开发库文件。
在这里插入图片描述

2.安装CAN盒驱动(已安装可忽略)

安装完成后,在电脑设备管理里面可以查看到CAN盒设备信息。
在这里插入图片描述

3.创建QT工程,完成CAN库配置

此处请参考转载的链接转载

4.我的QT配置

在第3步中,确定QT Creator的编译器版本,如果是32位则选择ControlCANx86,
,否则选择64位库。在实现第5步之前,先阅读二次动态库中的pdf说明文档。
在这里插入图片描述

5.QT代码实现基本数据读取

创建widget工程,添加CAN的头文件,和加载动态库后(看第3步链接)。如何实现CAN板卡的控制??
注意阅读《使用手册》的CAN接口调用流程:
流程截图
细节需参照文档,附上基本代码,仅打通基本数据接收,所以很多地方都是用的固定参数,更多的优化在熟悉后自行优化。

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    DWORD RET = VCI_OpenDevice(VCI_USBCAN_E_U,0,0);
    qDebug() << "open dev state:" <<RET;

    int baudrate = 0x060007;
    RET = VCI_SetReference(VCI_USBCAN_E_U,0,0,0,&baudrate);
    qDebug() << "VCI_SetReference:"<<RET;

    PVCI_INIT_CONFIG pInitConfig;
    pInitConfig->Mode = 0;
    RET = VCI_InitCAN(VCI_USBCAN_E_U, 0, 0, pInitConfig);
    if(RET == STATUS_ERR)
    {
        qDebug() << "Init can failure!";
    }else
    {
        qDebug() << "Init can OK!";
    }

    RET = VCI_StartCAN(VCI_USBCAN_E_U,0,0);
    if(RET != STATUS_OK)
    {
        qDebug() << "Start can failure!";
    }else
    {
        qDebug() << "Start can OK!";
    }
     ui->pushButton->setText("关闭");
    dataRecvTimer = new QTimer(this);
    dataRecvTimer->start();
    dataRecvTimer->setInterval(50);
    connect(dataRecvTimer,SIGNAL(timeout()),this,SLOT(on_dataRcve_event()));
}

接收数据槽函数,50ms会进来读取一次数据:

void Widget::on_dataRcve_event()
{
    DWORD RET ;
    ULONG num = 0;
    pErrInfo = new VCI_ERR_INFO;
    num = VCI_GetReceiveNum(VCI_USBCAN_E_U,0,0);

    if(num != 0)
    {
        qDebug()<< "VCI_GetReceiveNum:"<<num;
        VCI_CAN_OBJ vco[50];
        do{
             RET = VCI_Receive(VCI_USBCAN_E_U,0,0,vco,50,50);
             qDebug()<< "recv data num:"<<RET;
             for(DWORD i=0;i<RET;i++)
             {
                 QString str = "0x"+QString::number(vco[i].ID,16).toUpper()+" "+QString::number(vco[i].Data[0],16).toUpper()+" "+QString::number(vco[i].Data[1],16).toUpper()
                         +" "+QString::number(vco[i].Data[2],16).toUpper()+" "+QString::number(vco[i].Data[3],16).toUpper();
                 qDebug()<< "ID=0x"<<QString::number(vco[i].ID,16).toUpper()<<"data:"<<vco[i].Data[0]<<vco[i].Data[1]<<vco[i].Data[2]<<vco[i].Data[3];
                 ui->textBrowser->append(str);
             }

        }while(RET);
    }
}

其中,注意在初始化的时候,如果是USBCAN-E-U等几个型号,需先调用VCI_SetReference,再调用VCI_StartCAN,顺序不能反。
完成后,向CAN发送数据,可以实现接收打印:
在这里插入图片描述


总结

本文仅仅实现了基本的数据收取,实现USBCAN-E-U信号CAN的使用,代码有些凌乱,仅供参考学习。


版权声明:本文为weixin_47733174原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。