QT5使用PCAN读取CAN数据

2023-10-26

QT5使用PCAN读取CAN数据

项目中需要在QT框架中获取车辆的CAN信息,主要需要获取车速,方向盘,油门,挡位,刹车等信息。一开始准备用qt去调用PCANBasic.dll的API来实现这个功能,但意外的发现,QT5.8以上的版本,已经有内部的接口可以直接调用PCAN的插件,从而实现QT通过PCAN硬件设备读取CAN信息。PCAN支持的插件有如下,其中PeakCAN就是我们需要使用的插件了。
在这里插入图片描述

CAN Bus example

在欢迎模式上,搜索CAN,可以看到官方的例子,CAN Bus example。界面如下,plugin选择peakcan,就可以连上PCAN使用了。由于官方例子功能比较多,在简单应用下不需要这么多的功能,所以我简化了代码。
在这里插入图片描述

重点讲解

pro文件

pro文件里需要加serialbus这个库,才能在源文件中使用<QCanBus><QCanBusFrame><QCanBusDevice>这些头文件。

QT       += serialbus

创建CAN bus Device

创建CAN bus Device我们需要用到下面两个方法。

QList QCanBus::availableDevices(const QString &plugin, QString *errorMessage = nullptr) const
QCanBusDevice *QCanBus::createDevice(const QString &plugin, const QString &interfaceName, QString *errorMessage = nullptr) const

availableDevices(const QString &plugin, QString *errorMessage = nullptr)方法返回选定插件的接口信息,返回值是QList<QCanBusDeviceInfo>类型的,如果只接一个PCAN的话,list的大小是1。QCanBusDeviceInfo这个类包含接口的一些信息,我们主要使用其中的name方法,获取指定插件的有效接口。
createDevice(const QString &plugin, const QString &interfaceName, QString *errorMessage = nullptr)方法根据插件名和接口名,创建CAN bus Device。

QList<QCanBusDeviceInfo> m_interfaces;
QCanBusDevice *m_canDevice=nullptr;
const QString plugin="peakcan";
QString errorString;
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";
    }

如果创建成功,会返回QCanBusDevice类型的指针,我们可以用这个设备的指针去做参数配置、设备连接、设备断开连接、readframe等操作。如果创建失败,会返回nullptr
设备创建成功才能做参数配置,所以需要做一个判断,创建成功,有一个最重要的参数需要配置,就是波特率,因为一般车子的波特率是500kBit/s。所以我们设定500000。其他的参数可以默认。
connectDevice()方法用来连接设备,连接成功会返回true。相应的disconnectDevice()用来断开设备,释放端口。

const int bitrate=500000;
bool connectflag=false;
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;
    }

参数设置

void QCanBusDevice::setConfigurationParameter(int key, const QVariant &value)

device参数的配置用上面这个方法,其中key是参数类型(枚举量),value是参数的值,根据需求来设定。
key的枚举量如下:在这里插入图片描述
讲几个key,其他的暂时没用上,可根据官方文档详细了解。
RawFilterKey设定滤波的,可以滤掉指定id的报文,值的类型是QList<QCanBusDevice::Filter>类型的,但不是所有的插件都支持这个功能,PCAN就不支持。
BitRateKey设置波特率的,根据需求设置波特率。
CanFdKey 设置CAN的帧格式,是标准格式还是CANFD格式。值是bool量。
DataBitRateKey设置数据传输率,当CAN的帧格式时CANFD格式的时候,需要设置。

接收报文

设备连接成功后,就需要关联两组信号和槽,一个是errorOccurred信号,故障发生时发射,一个framesReceived信号,收到报文的时候发射。相应的槽,对该信号发射后,进行处理和操作。

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

errorOccurred信号会携带QCanBusDevice::CanBusError(枚举量)类型的参数,我在processErrors这个槽函数没有做任何额外的处理,只是调用QCanBusDevice::errorString()打印出来了错误信息。有需求的话可以在每个case里,做对该错误的处理。

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;
    }
}

framesReceived信号发出代表有报文收到了,framesAvailable()返回在内部队列的报文条数,readFrame()从队列里弹出一条报文并返回QCanBusFrame类型的frame。还有一个readAllFrames()方法,这个方法是取出对列里的所有报文,返回QVector<QCanBusFrame>类型的vector。
举个例子,队列里有5条报文,framesAvailable()会返回5,readFrame()方法调用后,在没有新报文加入队列的情况下,framesAvailable()会返回4,因为readFrame()已经从队列中弹出了一条报文。如果使用readAllFrames()方法,5条会被全部弹出,vector的大小也为5。

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;
       // short temp3;
        if (frame.frameType() == QCanBusFrame::ErrorFrame)
        {
            view = m_canDevice->interpretErrorFrame(frame);
        }
        else if(frame.frameType()==QCanBusFrame::DataFrame)
        {
            view=frame.toString();
        }
        qDebug()<<view;

    }
}

PCAN支持的QCanBusDevice::ConfigurationKey类型

在这里插入图片描述
上传demo
candemo

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT5使用PCAN读取CAN数据 的相关文章

  • 如何从 std::thread 更改 GUI?

    首先 我尝试使用setVisible from thread 有一个事件 void MainWindow OnShow Start OnShow actions ui gt LoadingBox gt setVisible true std
  • cLion + Qt5 - 退出代码 -1073741515 (0xC0000135)

    我正在尝试使用 QT5 和 cLion 运行简单的测试 但我遇到了退出代码墙 这是我的环境 克狮2017 2minGw 5 0 cMake 3 8 2Qt 5 9 0 CMakeList txt cmake minimum required
  • 在QML中动态创建ListModel

    当我需要在运行时创建任何 QML 组件时 我可以使用该指南 http qt project org doc qt 5 qtqml javascript dynamicobjectcreation html http qt project o
  • 如何在 QtCreator 中分​​析 PySide2 + QML?

    我有一个 PySide2 应用程序 它使用 QML 来显示用户界面 该应用程序通过命令行运行 我还可以启动它并在 QtCreator 中调试它 但是 当我尝试运行 QmlProfiler 时 我看到以下错误 1 error home use
  • VS2012 nmake 使用 v110_xp 工具集?

    有没有办法使用v110 xp使用 nmake 编译时的工具集 而不是默认的 v110 我正在尝试为 VisualStudio2012 编译 Qt5 库 并且我也需要它在 Windows XP 计算机上工作 我已经成功地使用 VS2012 和
  • Qt5参考文档:qch文件

    我想在 QtAssistant 中查看 Qt 参考文档 但是 Qt5 的安装没有附带 Qt 库的 qch 文档文件 我试图在http qt project org http qt project org但到处都找不到它们 如何获取 Qt5
  • 如何增加 QListWidget 中项目/行的填充(或边距)?

    我们正在寻找一种方法来增加填充 或边距 QListWidget我们正在我们的应用程序中使用 我们希望为所有四个方向增加此值 以便为列表中的文本提供一些额外的空间 我查看了两者的文档QListWidget http doc qt io qt
  • Qt如何连接rubberBandChanged信号

    我尝试将 QChartView 类中的 ruby BandChanged 信号链接到 MainWindow 类中的特定函数 主窗口 h class MainWindow public QMainWindow Q OBJECT public
  • QtRuby 可以与 Qt 5 一起使用吗?

    我可以在网上找到的所有内容QtRuby https duckduckgo com q ruby and qt使用 Qt 4 但当前的 Qt 版本是 5 这是否只是文档跟不上现实的问题 Qt 5 可以与 QtRuby 一起正常工作 如果您断言
  • qt webengine将javascript输出重定向到GUI

    我有一个可以查看页面的应用程序QWebEngineView小部件如何将我的 javascript 控制台日志重定向到我的 GUI 它当前显示在我的调试输出中 您必须子类化 QWebEnginePage 才能覆盖 javaScriptCons
  • 在 MacOSX 上,当指定无效的身份验证凭据时,QNetworkAccessManager 会进入无限循环

    在我的跨平台应用程序中 我使用 QNetworkAccessManager 将 HTTP 请求发送到需要身份验证的 HTTP 服务 我最近升级到 QT5 令我完全惊讶的是 在 MacOSX 上 我的应用程序会在某些情况下尽快向我的服务发送大
  • QML:原始模型中的动态视图重新排序

    使用此 Qt 教程通过拖动视图项来实现 QML 动态视图排序 QML 动态视图排序教程 https doc qt io qt 5 qml dynamicview tutorial html 原始底层模型是QAbstractListModel
  • 本机 KDE 查找 Qt 5 应用程序

    我在 Kubuntu 12 10 Linux 机器上安装了 Qt5 和 Qt4 并注意到以下内容 使用 Qt4 编译的程序具有原生 KDE 外观和感觉 我使用默认的 KDEOxygen主题 我的程序也是如此 注意带有标题的平滑渐变和聚焦小部
  • 如何在 QtQuick Controls 2 中将对话框置于屏幕中央?

    我的所有对话框都出现在屏幕的左上角而不是中心 让对话框自动正确放置的最佳方法是什么 import QtQuick 2 7 import QtQuick Controls 2 2 ApplicationWindow id mainWindow
  • QT5 迁移和 Boost:if.hpp:宏参数不匹配错误

    在 qt 4 8 中我使用了 boost 1 52 一切都好 现在我尝试转移到 QT5 并得到if hpp Macro argument mismatch线上错误131 BOOST MPL AUX NA SPEC 3 if 在一些QT论坛
  • 如何在 Qt 5 中写入和读取 QResource 文件?

    很奇怪 我通过以下方式将所需的文件添加到资源中添加现有文件 文件就在那里 我运行 qmake 构建 gt 运行 qmake 以使文件可用 第一期 我无法从输出终端向文件写入任何内容 但是当我手动写入文件时 每次运行它时输出终端都会显示更改
  • QGeoCoordinate:没有这样的文件或目录

    我正在尝试使用 QtLocation 但不能 我不明白为什么 我在 ubuntu 14 04 上使用 qt5 3 2 这很奇怪 因为我将这一行添加到我的 pro 文件中 QT network CONFIG mobility MOBILITY
  • Qt3D 是 Qt5 的一部分吗?

    我在windows中安装了Qt5库 但Qt助手中没有关于Qt3D的文档 Qt3D 是 Qt5 的一部分还是已从发布版本 5 中删除 是的 Qt 3D 成为标准 Qt 库Qt 5 7 发布 http blog qt io blog 2016
  • Qt 5.4/Qml:防止绑定循环

    我有一个全局单例 设置 它保存应用程序设置 当我尝试运行以下代码时 我得到一个QML CheckBox Binding loop detected for property checked CheckBox checked Settings
  • Qt 的 sysroot 和前缀选项的实际示例是什么

    我正在查看可以运行的所有选项configureQt 提供的脚本 特别是 qt everywhere opensource src 5 2 0 经过大量搜索后 我确定这些东西充其量记录很少 所以我希望我能得到一些帮助 当我查看描述时prefi

随机推荐

  • python循环综合运用

    循环很重要 计算机很蠢 唯一的优势就是按照指令不停的执行 所以决定在说一下 break语句 用在循环体中 迫使循环立即终止 即跳出所在循环体 继续执行循环体后面的语句 sum 0 i 1 while i sum i i 1 if i gt
  • 生成随机mask以及根据mask对两幅图片进行合并

    前言 对图像处理的一些操作还是需要掌握的嘿嘿 随机mask生成 这里代码参考MAT的一份代码 https github com fenglinglwb MAT blob main datasets mask generator 256 py
  • 机器人学基础(2)-微分运动和速度-雅可比矩阵计算、雅可比矩阵求逆、计算关节运动速度

    机器人学基础 2 微分运动和速度 雅可比矩阵计算 雅可比矩阵求逆 计算关节运动速度 本文知识点 坐标系的微分运动 坐标系之间的微分变化 机器人和机器人手坐标系的微分运动 雅可比矩阵的计算 雅可比矩阵求逆 雅可比矩阵和微分算子之间的关联 文章
  • flea-db使用之JPA接入

    JPA接入 1 准备工作 2 接入讲解 2 1 实体类 2 2 持久化单元DAO层实现 2 3 配置介绍 2 4 学生DAO层接口 2 5 学生DAO层实现 2 6 学生SV层接口 2 7 学生SV层实现 2 8 JPA接入自测 2 8 1
  • Pycharm连接Mysql数据库

    import pandas as pd import pymysql from sqlalchemy import create engine 创建一个Mysql连接器 用户名为root 密码123456 地址为127 0 0 1 数据库名
  • 游戏开发日志17(保存技能树信息)

    最开始的想法是这样的 在GameManage中写一个public List
  • 剑指 Offer 50. 第一个只出现一次的字符(C++实现)

    剑指 Offer 50 第一个只出现一次的字符https leetcode cn problems di yi ge zhi chu xian yi ci de zi fu lcof 遍历两次数组 第一次遍历 通过哈希表记录每个字母出现的次
  • CMake中configure_file的使用

    CMake中的configure file命令用于将一个文件拷贝到另一个位置并修改其内容 其格式如下 configure file
  • 微信网页开发调用微信jssdk接口遇到的坑以及最终解决方法 (持续更新)

    1 微信网页开发调用jssdk时报permission denied 大致是两个原因 1 首先注册时未将你所调用的接口名字添加至jsApiList 2 第二个就是你的这个公众号没有权限使用这个api 例如在开发环境中的微信页面就无法调取这个
  • (六)使用Transformers进行情感分析

    文章目录 准备数据 搭建模型 训练模型 推断 完整代码 在本笔记本中我们将使用在本 论文中介绍的Transformer模型 具体来说 我们将使用来自这篇 论文中的BERT Bidirectional Encoder Representati
  • 《KyLin学习理解》-01-KyLin麒麟的简介及其思想

    1 美图 1 诞生背景 HIVE是数据仓库 是把存储在HDFS分布式文件系统的存储文件映射到类似于关系型数据库的东西 举个例子 假设有一个文件存储在本地 opt hzjs lcc work pro txt文件 文件的格式为 1 产品120
  • html 单选打勾效果,checkbox 实现单选效果(html)

    note 在html 标签类中的checkbox实现单选效果 在最近的开发项目中 客户要求使用小方格子实现 单选 功能 显然圆点的radio被out了 只能选择chckbox的方块样式 也在网上搜过 可能有点儿脑残 没有找到 废话不多说直接
  • c++网络编程3:UDP编程

    一 概念 UDP是传输层中面向无连接的协议 所以UDP丢包后是不会重传的 而且他在编程上服务端和客户端是没有区别的 有的只是 虚拟上 的服务端和客户端 他在编程的实现上也很简单 不像TCP那么复杂 二 UDP终端的编程 由于UDP在服务端和
  • 不同型号服务器esxi,如果管理多个esxi服务器

    如果管理多个esxi服务器 没有 装一个vcenter吧 可以集中管理 多台服务器之间还可以做双机热备等功能 很好用 至于注册序列号 你漫天都是 你可以把分数拉高一点 我送给你一个 哈哈 如何给esxi搭建ntp服务器 提在ESX ESXi
  • Windows系统的JDK安装与配置

    1 选择JDK版本 以在Windows 64位平台上安装JDK 8版本为例 JDK 8 Windows版官网下载地址 https www oracle com java technologies downloads java8 window
  • Redis的安装

    环境 用的Linux系统阿里云服务器 1 在redis官网下载最新稳定版的安装包 官网网址 https redis io 2 下载完的安装包通过Xftp上传到 opt目录下 3 连接上远程服务器60 205 189 176端口22 输入下面
  • 离线实时一体化数仓与湖仓一体—云原生大数据平台的持续演进

    林伟 阿里云智能研究员 阿里云智能通用计算平台MaxCompute 机器学习PAI平台技术负责人 本篇内容将从三个部分为读者讲述离线实时一体化数仓与湖仓一体 云原生大数据平台的持续演进 通过从数据湖到数仓的历史 反思为什么要做湖仓一体 以及
  • 向“全栈”进发,大型线上商城实战项目,Spring Boot + Vue 前后端分离版本的商城来了(文末有视频)

    新蜂商城 Vue 版本 它来了 文末有视频 如上图所示 新蜂商城 Vue 版本已经开发完成 这是新蜂商城开源项目的第一个大版本更新 根据大量的用户调研 最终决定将新蜂商城升级为 Spring Boot Vue 两个流行技术栈的前后端分离商城
  • Web开发-基础环境配置

    Web开发 基础环境配置 回炉再造 2021 Vue3 0 前端全家桶学习笔记 web前端职业发展路线 技术范围广 发展速度快 兼容浏览器众多 核心技术 html css JavaScript BOM DOM 新的技术 html5 css3
  • QT5使用PCAN读取CAN数据

    文章目录 QT5使用PCAN读取CAN数据 CAN Bus example 重点讲解 pro文件 创建CAN bus Device 参数设置 接收报文 PCAN支持的QCanBusDevice ConfigurationKey类型 QT5使