linux系统中使用QT实现CAN通信的方法

简介: linux系统中使用QT实现CAN通信的方法

      大家好,今天主要和大家分享一下,如何使用QT中的CAN Bus的具体实现方法。



 

第一:CAN Bus的基本简介

     从QT5.8开始,提供了CAN Bus很庆幸,我们可以直接使用QT提供的CAN相关类的编程即可。从资源上来看,开发板上预留了一个CAN接口。

     

第二:CAN通信应用实例

      可以直接使用开发板,需要使用CAN必须进行初始化,它的开启与关闭都是由系统完成。最大比特率为 1000kBit/s

利用命令开启CAN。

ip link set up can0 type can bitrate 1000000 restart-ms 100

    需要在pro项目文件添加相应的模块支持,需要添加对应的头文件。

QT += core gui serialbus

   在头文件“mainwindow.h”的代码如下。一些声明。

1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3
4 #include <QMainWindow>
5 #include <QCanBusDevice>
6 #include <QCanBus>
7 #include <QPushButton>
8 #include <QTextBrowser>
9 #include <QLineEdit>
10 #include <QVBoxLayout>
11 #include <QLabel>
12 #include <QComboBox>
13 #include <QGridLayout>
14 #include <QMessageBox>
15 #include <QDebug>
17 class MainWindow : public QMainWindow
18 {
19 Q_OBJECT
20
21 public:
22 MainWindow(QWidget *parent = nullptr);
23 ~MainWindow();
24
25 private:
26 /* CAN 设备 */
27 QCanBusDevice *canDevice;
28
29 /* 用作接收数据 */
30 QTextBrowser *textBrowser;
31
32 /* 用作发送数据 */
33 QLineEdit *lineEdit;
34
35 /* 按钮 */
36 QPushButton *pushButton[2];
37
38 /* 下拉选择盒子 */
39 QComboBox *comboBox[3];
40
41 /* 标签 */
42 QLabel *label[4];
43
44 /* 垂直布局 */
45 QVBoxLayout *vboxLayout;
46
47 /* 网络布局 */
48 QGridLayout *gridLayout;
49
50 /* 主布局 */
51 QWidget *mainWidget;
52
53 /* 设置功能区域 */
54 QWidget *funcWidget;
55
56 /* 布局初始化 */
57 void layoutInit();
58
59 /* 插件类型项初始化 */
60 void pluginItemInit();
61
62 /* 比特率项初始化 */
63 void bitrateItemInit();
64
65 private slots:
66 /* 发送消息 */
67 void sendFrame();
68
69 /* 接收消息 */
70 void receivedFrames();
71
72 /* 插件发生改变 */
73 void pluginChanged(int);
74
75 /* 处理 can 错误 */
76 void canDeviceErrors(QCanBusDevice::CanBusError) const;
77
78 /* 连接或者断开 can */
79 void connectDevice();
80 };
81 #endif // MAINWINDOW_H
82

     在mainwindow.cpp的具体实现方法

1 #include "mainwindow.h"
2 #include <QGuiApplication>
3 #include <QScreen>
4 
5 MainWindow::MainWindow(QWidget *parent)
6 : QMainWindow(parent)
7 {
8 /* 使用系统指令比特率初始化 CAN,默认为 1000000bits/s */
9 system("ifconfig can0 down");
10 system("ip link set up can0 type can bitrate 1000000 restart-ms 100");
11
12 /* 布局初始化 */
13 layoutInit();
14
15 /* 可用插件初始化 */
16 pluginItemInit();
17
18 /* 可用接口项初始化 */
19 pluginChanged(comboBox[0]->currentIndex());
20
21 /* 比特率项初始化 */
22 bitrateItemInit();
23 }

     分析:连接/断开 CAN,很遗憾 Qt QCanBusDevice::BitRateKey 不能设置比特率,因为系统的 CAN 需要使用 ip 指令以一个比特率才能进行初始化,Qt 需要系统 CAN 起来才能进行操作。所以需要使用系统指令设置 CAN

第三:程序的运行效果

    在 Ubuntu 上运行 界面效果如下,因为 Ubutnu 没有 CAN 设备,所以在可用接口处是不可选的。请把程序交叉编译到开发板上运行。与 CAN 仪器以相同的比特率通信,插件类型默认是(必须是)socketcan,可用接口为 can0,即可发送消息与接收消息。

目录
相关文章
|
2月前
|
存储 缓存 监控
Linux缓存管理:如何安全地清理系统缓存
在Linux系统中,内存管理至关重要。本文详细介绍了如何安全地清理系统缓存,特别是通过使用`/proc/sys/vm/drop_caches`接口。内容包括清理缓存的原因、步骤、注意事项和最佳实践,帮助你在必要时优化系统性能。
217 78
|
24天前
|
缓存 安全 Linux
Linux系统查看操作系统版本信息、CPU信息、模块信息
在Linux系统中,常用命令可帮助用户查看操作系统版本、CPU信息和模块信息
88 23
|
2月前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
117 13
|
2月前
|
Ubuntu Linux C++
Win10系统上直接使用linux子系统教程(仅需五步!超简单,快速上手)
本文介绍了如何在Windows 10上安装并使用Linux子系统。首先,通过应用商店安装Windows Terminal和Linux系统(如Ubuntu)。接着,在控制面板中启用“适用于Linux的Windows子系统”并重启电脑。最后,在Windows Terminal中选择安装的Linux系统即可开始使用。文中还提供了注意事项和进一步配置的链接。
52 0
|
7月前
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
235 1
|
6月前
|
监控 C++ 容器
【qt】MDI多文档界面开发
【qt】MDI多文档界面开发
185 0
|
5月前
Qt开发
Qt开发
|
5月前
|
开发工具 C++
qt开发技巧与三个问题点
本文介绍了三个Qt开发中的常见问题及其解决方法,并提供了一些实用的开发技巧。
119 0
|
6月前
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
256 2
Qt开发网络嗅探器02
Qt开发网络嗅探器02