首页 > 其他分享 >PCAN的使用简单demo

PCAN的使用简单demo

时间:2024-11-22 09:57:10浏览次数:1  
标签:PCAN const demo QCanBusDevice canDevice 简单 qDebug include MainWindow

参考   PCAN示例资源文件介绍:PCAN示例资源文件介绍 - GitCode

 此处就是界面上添加了一个 按钮,用于创建连接,界面代码自己简单做一个

pro中添加  serialbus

QT       += serialbus

 

.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QCanBusDevice>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    //std::unique_ptr<QCanBusDevice> m_canDevice;
    QCanBusDevice *m_canDevice=nullptr;
    QList<QCanBusDeviceInfo> m_interfaces;
    short tacomathrottle;
    short tacomasteer;
    short tacomaspeed;
    bool tacomabrake;
private slots:
    void processReceivedFrames();
    void processErrors(QCanBusDevice::CanBusError) const;
    void canconnectclicked();
};
#endif // MAINWINDOW_H

 

.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QCanBus>
#include <QDebug>
#include <QCanBusFrame>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    connect(ui->canBT,&QPushButton::clicked,this,&MainWindow::canconnectclicked);

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::processErrors(QCanBusDevice::CanBusError error) const
{
    switch (error) {
    case QCanBusDevice::ReadError:
    case QCanBusDevice::WriteError:
    case QCanBusDevice::ConnectionError:
    case QCanBusDevice::ConfigurationError:
    case QCanBusDevice::UnknownError:
        qDebug()<<m_canDevice->errorString();
        break;
    default:
        break;
    }
}

void MainWindow::processReceivedFrames()
{
    if (!m_canDevice)
        return;

    while (m_canDevice->framesAvailable())
    {
        const QCanBusFrame frame = m_canDevice->readFrame();
        //qDebug()<<frame.error();
        // qDebug()<<frame.frameId();//frame id,it's decimal
        //qDebug()<<frame.frameType();//1 means dataframe
        //qDebug()<<m_canDevice->state();

        QString view;
        if (frame.frameType() == QCanBusFrame::ErrorFrame)
        {
            view = m_canDevice->interpretErrorFrame(frame);
        }
        else if(frame.frameType()==QCanBusFrame::DataFrame)
        {
            view=frame.toString();
        }
        qDebug()<<view;

    }
}


void MainWindow::canconnectclicked()
{
    //QCanBus::instance()->plugins();
    const QString plugin="peakcan";
    const int bitrate=500000;
    bool connectflag=false;
    QString errorString;


    //const QString plugin="virtualcan";
    // qDebug()<< QCanBus::instance()->plugins();
    m_interfaces = QCanBus::instance()->availableDevices(plugin);
    if(!m_interfaces.empty())
    {
        qDebug()<<m_interfaces.begin()->name();
        m_canDevice=QCanBus::instance()->createDevice(plugin, m_interfaces.begin()->name(), &errorString);
    }
    else
    {
        qDebug()<<"do not find available interface for pcan";
    }

    if (!m_canDevice)
    {
        qDebug() <<"createDevice error" <<errorString;
    }
    else
    {
        /***peakcan do not support configuration key RawFilterKey***/
        //        QCanBusDevice::Filter filter;
        //        QList<QCanBusDevice::Filter> filterList;
        //        // filter all CAN bus packages with id 0x444 (base) or 0xXXXXX444 (extended)
        //        filter.frameId = 0x444u;
        //        qDebug()<<filter.frameId;
        //        filter.frameIdMask = 0x0u;
        //        filter.format = QCanBusDevice::Filter::MatchBaseFormat;
        //        filter.type = QCanBusFrame::DataFrame;
        //        filterList.append(filter);
        //        m_canDevice->setConfigurationParameter(QCanBusDevice::RawFilterKey, QVariant::fromValue(filterList));
        m_canDevice->setConfigurationParameter(QCanBusDevice::BitRateKey,QVariant(bitrate));
        connectflag= m_canDevice->connectDevice();
        qDebug()<<"connecflag"<<connectflag;
    }

    if(connectflag)
    {
        connect(m_canDevice, &QCanBusDevice::errorOccurred,
                this, &MainWindow::processErrors);
        connect(m_canDevice, &QCanBusDevice::framesReceived,
                this, &MainWindow::processReceivedFrames);
        ui->canBT->setEnabled(false);
    }
}

 

标签:PCAN,const,demo,QCanBusDevice,canDevice,简单,qDebug,include,MainWindow
From: https://www.cnblogs.com/RYSBlog/p/18562117

相关文章

  • OKhttpClient 简单使用总结
    <!--okhttp--><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>3.6.0</version></dependency><!--okhttp/--> @Servicepublicclas......
  • 多线程编程入门Thread_Task_async_await简单秒懂
    `usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Threading;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;namespace多线程编......
  • Next.js项目App目录如何简单集成markdown博客
    文章原文:Next.js项目App目录如何简单集成markdown博客此教程适用于比较简单的项目实现,如果你是刚入门next,并且不想用太复杂的方式去实现一个博客项目,那么这个教程就挺适合你的。Next.js官方关于markdown的文档有说明过如何渲染markdown,也是针对App目录的,但我尝试过并不太行,可能......
  • QOJ6958-复杂的双树上问题以及简单的解决方式
    题面原题链接思路我们考虑如何判断一对\(T_1,T_2\)是否合法。首先,我们可以发现\(T_2\)上的边权只能有至多一组合法解,这是因为对于任意一条边连接\(u,v\),它的边权必然是\(dis_1(u,v)\),所以事实上我们是没有权限给\(T_2\)任意赋权的,这样题目就简单了一些。那么,我们如何......
  • KOA 入门,简单实现用户注册和登录逻辑
    koa首先来介绍一下什么是koa。koa是由Express背后的团队设计的一个新的Web框架,旨在成为Web应用和API的更小、更具表现力和更强大的基础。通过利用异步函数,koa允许你放弃回调并大大提高错误处理能力。koa的核心中没有捆绑任何中间件,它提供了一套优雅的方法,使编写......
  • 【基于PyTorch的简单多层感知机(MLP)神经网络(深度学习经典代码实现)】
    importtorchfromtorchvisionimporttransformsfromtorchvisionimportdatasetsfromtorch.utils.dataimportDataLoaderimporttorch.nn.functionalasFimporttorch.optimasoptim#准备数据集batch_size=64transform=transforms.Compose([transforms.......
  • 简单几步,基于云主机快速为Web项目添加AI助手
    在华为开发者空间,借助华为云对话机器人服务CBS您可以零代码创建一个大模型RAG(Retrieval-AugmentedGeneration,即检索增强生成)应用,来实现AI助手的智能问答能力。本实验借助华为云CBS提供的可访问API,在项目代码中通过几行代码引入AI助手,用户就可以在网站上看到一个AI助手......
  • 最简单的纯CSS3滑动开关按钮特效
    在线预览  下载HTML结构该滑动按钮的基本HTML结构使用一个<label>元素来包裹一个<input>元素和2个<span>元素。span.text-switch是按钮上的文字和背景,span.toggle-btn是滑动的按钮。<labelclass="switch-btn">    <inputclass="checked-switch"type="check......
  • 使用简单实验体验k8s的热升级机制
    热升级pod负载均衡的容错基本可以了,现在考虑要升级一下这个容器,把其中的test.go修改一下,返回hello,world的同时打印一下HOSTNAME。packagemainimport("fmt""net/http""os")funcmain(){fmt.Println("startmain")//从环境变量取ho......
  • 使用deployment管理简单的服务器
    承接上文使用k8s搭建一个简单的golang服务器使用deployment管理起来直接创建deployment来创建pod,顺便测试一下故障场景,修改一下test.go来增加退出场景,需要重新制作镜像,参考上面即可。packagemainimport("fmt""net/http""os")funcmain(){fm......