大家好,今天主要和大家分享一下,如何使用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,即可发送消息与接收消息。