PCAN的使用简单demo

参考   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);
    }
}

 

posted @ 2024-11-22 10:03  小城熊儿  阅读(11)  评论(0编辑  收藏  举报