QT+vs2020 PCAN上位机开发

        本文将自己的QT+VS2020环境的PCAN上位机开发分享给技术爱好者。

一、使用介绍

        PCANBasic开发包包好了的几个主要文件说明:

        PCANBasic.h:为接口头文件,定义了PCAN操作的一些指令和接口说明;

        PCANBasic.dll:动态库文件;

        PCANBasic.lib:静态库文件;

二、上位机界面

         

                                                                配置界面

配置完成界面

        以上上位机界面由于是标准化界面,因此默认显示两个CAN端口,实际PCAN只有1个CAN端口,数据会在CAN0上显示

数据接收显示

        以上界面支持查看详细信息,和历史数据导出。

三、关键驱动代码

        驱动加载分为静态加载和动态加载:本文按照静态加载方式设计,如果有需要动态加载的可以看本人的资源中可以下载资源,里面的案例即通过动态加载DLL文件,并通过名字获取接口操作指针的。

程序目录如下,其中箭头所指为PCAN关键所在:

        

1、扫描PCAN设备:
void PcanMathod::Pcan_Seach()
{
    TPCANChannelInformation* info;
    TPCANStatus ret;
    DWORD pcan_ChannelsCount;
    ret = CAN_GetValue(PCAN_NONEBUS, PCAN_ATTACHED_CHANNELS_COUNT, (void*)&pcan_ChannelsCount, sizeof(pcan_ChannelsCount));
    if (ret == PCAN_ERROR_OK)
    {
        info = new TPCANChannelInformation[pcan_ChannelsCount];
        ret = CAN_GetValue(PCAN_NONEBUS, PCAN_ATTACHED_CHANNELS, (void*)info, pcan_ChannelsCount * sizeof(TPCANChannelInformation));
        if (ret == PCAN_ERROR_OK)
            // Include only connectable channels
            //
            for (int i = 0; i < (int)pcan_ChannelsCount; i++) {
                if (info[i].channel_condition & PCAN_CHANNEL_AVAILABLE) //通道有效,且未被使用
                {
                    bIsFD = info[i].device_features & FEATURE_FD_CAPABLE; //判断是否是FD设备
                    m_HwInfo.append(info[i]);
                }
            }
        Pcan_SetChannel(0); //默认设置为通道0
        delete[] info;
    }
}
2、配置并开启PCAN
/*
* 设备开启
*/
void PcanMathod::Open(quint32 bd_rate)
{
    qint16 stsResult;
    if (bIsFD) {
        char txtBitrate[] = "f_clock_mhz=20, nom_brp=5, nom_tseg1=2, nom_tseg2=1, nom_sjw=1, data_brp=2, data_tseg1=3, data_tseg2=1, data_sjw=1";
        stsResult = InitializeFD(txtBitrate);
    }
    else {
        TPCANBaudrate rate = PCAN_BAUD_250K;
        switch (bd_rate) {
            case 1000:
                rate = PCAN_BAUD_1M;
                break;
            case 800:
                rate = PCAN_BAUD_800K;
                break;
            case 500:
                rate = PCAN_BAUD_500K;
                break;
            case 250:
                rate = PCAN_BAUD_250K;
                break;
            case 125:
                rate = PCAN_BAUD_125K;
                break;
            case 100:
                rate = PCAN_BAUD_100K;
                break;
            case 95:
                rate = PCAN_BAUD_95K;
                break;
            case 83:
                rate = PCAN_BAUD_83K;
                break;
            case 50:
                rate = PCAN_BAUD_50K;
                break;
            case 47:
                rate = PCAN_BAUD_47K;
                break;
            case 33:
                rate = PCAN_BAUD_33K;
                break;
            case 20:
                rate = PCAN_BAUD_20K;
                break;
            case 10:
                rate = PCAN_BAUD_10K;
                break;
            case 5:
                rate = PCAN_BAUD_5K;
                break;
        }
        stsResult = Initialize(rate, PCAN_TYPE_ISA, 0x100, 0x03);//后面两个参数固定
    }

    if (stsResult != PCAN_ERROR_OK) {
        if (stsResult != PCAN_ERROR_CAUTION) {
            dev_status = false;
            qDebug() << QObject::tr("can open failed!");
            return;
        }
        else {
            qDebug() << QObject::tr("The bitrate being used is different than the given one");
            return;
        }
    }
    else {
        dev_status = true;
        QTimer::singleShot(300, this, [=]() { //延时300ms后发送启动当前USB线程
            QFuture featrue0 = QtConcurrent::run(&PcanMathod::DataSendFture, this);//将任务放入线程池中运行
        QFuture featrue1 = QtConcurrent::run(&PcanMathod::DataReadFture, this);//将任务放入线程池中运行
            });
        qDebug() << QObject::tr("can open success!");
    }
}
3、数据发送
/*
* 数据发送接口
*/
void PcanMathod::SendData(CAN_DATA_FRAME* frame)
{
    TPCANMsg msg;
    tagTPCANMsgFD msgfd;

    msg.ID = *(quint32*)frame->CanId;
    msg.LEN = frame->Dlc;
    if (frame->IDE == CAN_IDE_EXT) {
        msg.MSGTYPE = PCAN_MESSAGE_EXTENDED;
    }
    else if (frame->IDE == CAN_IDE_STD) {
        msg.MSGTYPE = PCAN_MESSAGE_STANDARD;
    }
    memcpy(msg.DATA, frame->CanDta, frame->Dlc);

    TPCANStatus stsResult;
    // The message is sent
    stsResult = bIsFD ? WriteFD(&msgfd) : Write(&msg);

    // The Hardware was successfully sent
    if (stsResult == PCAN_ERROR_OK) {
        //发送成功
    }
    else {
        qDebug() << tr("pcan send err");
    }
    return;
}
4、数据接收
/*
* 数据接收线程
*/
void PcanMathod::DataReadFture()
{
    TPCANMsg CANMsg;
    TPCANTimestamp CANTimeStamp;
    TPCANStatus stsResult;
    
    while (dev_status) {
        stsResult = Read(&CANMsg, &CANTimeStamp);
        if (stsResult != PCAN_ERROR_QRCVEMPTY) {
            Pcan_Analysis_Package(CANMsg, CANTimeStamp);
        }
        else {
        }
    }
}
/*
* NPCW数据解析接口
*/
void PcanMathod::Pcan_Analysis_Package(TPCANMsg msg, TPCANTimestamp timestamp)
{
    CAN_DATA_FRAME rev_frame;
    quint64 m_tt = timestamp.micros + (1000ULL * timestamp.millis) + (0x100'000'000ULL * 1000ULL * timestamp.millis_overflow);
    memcpy(rev_frame.CanDta, msg.DATA, msg.LEN);
    memcpy(rev_frame.CanId, (quint8*)&msg.ID, sizeof(msg.ID));
    rev_frame.CanNo = CAN0_TYPECODE;//PCAN只有一个CAN,定义他为CAN0
    rev_frame.Dir = true; //数据接收
    rev_frame.Dlc = msg.LEN;
    if (msg.MSGTYPE == PCAN_MESSAGE_STANDARD) {
        rev_frame.IDE = CAN_IDE_STD;
    }
    else if (msg.MSGTYPE == PCAN_MESSAGE_EXTENDED) {
        rev_frame.IDE = CAN_IDE_EXT;
    }
    else if (msg.MSGTYPE == PCAN_MESSAGE_ERRFRAME) {
        rev_frame.IDE = CAN_IDE_ERR;
    }
    rev_frame.Time = QTime::currentTime().msecsSinceStartOfDay();
    emit DataReady(rev_frame);
}
5、关闭设备
/*
* 设备关闭
*/
void PcanMathod::Close()
{
    dev_status = false;
    Uninitialize();
}

四、资源下载

        https://download.csdn.net/download/hujunjie1/88617045

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java PCAN上位机是一种基于Java语言编写的PCAN总线上的上位机应用程序。PCAN总线是一种用于控制器区域网络(CAN)的通信协议,它广泛应用于汽车和工业控制系统等领域。 Java PCAN上位机具有以下特点和功能: 1. 跨平台性:由于Java语言的特性,Java PCAN上位机可以在不同的操作系统上运行,如Windows、Linux和Mac OS等。 2. 数据传输:Java PCAN上位机可以通过PCAN总线与各种CAN设备进行数据交换和通信,如CAN接口卡、CAN控制器等。 3. 数据监测和显示:Java PCAN上位机可以实时监测和显示PCAN总线上的CAN消息,包括CAN帧的ID、数据和时间戳等信息,并提供可视化界面进行数据展示。 4. 数据分析和处理:Java PCAN上位机可以对收集到的CAN数据进行分析和处理,如数据过滤、统计和图表展示等功能。 5. 数据发送和接收:Java PCAN上位机可以发送CAN消息到PCAN总线上的其他设备,并接收来自其他设备的CAN消息,实现多设备之间的数据交互。 6. 用户界面:Java PCAN上位机提供友好的用户界面,使用户可以方便地操作和配置PCAN总线上的设备和参数。 7. 扩展性:Java PCAN上位机具有良好的扩展性,可以根据实际需求进行功能上的扩展和定制化开发。 总之,Java PCAN上位机是一种功能强大、易于使用和跨平台的PCAN总线上的上位机应用程序,为CAN总线的数据监测、分析和通信提供了便利和灵活性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

漂流中

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

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

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

打赏作者

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

抵扣说明:

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

余额充值