完成can打开设备函数

This commit is contained in:
mhvhm 2024-09-13 00:25:45 +08:00
parent 990dfb3aff
commit c531bb89c3
12 changed files with 741 additions and 4 deletions

View File

@ -16,10 +16,12 @@ DEFINES += QT_DEPRECATED_WARNINGS
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \ SOURCES += \
app/CANThread/canthread.cpp \
main.cpp \ main.cpp \
mainwindow.cpp mainwindow.cpp
HEADERS += \ HEADERS += \
app/CANThread/canthread.h \
mainwindow.h mainwindow.h
FORMS += \ FORMS += \
@ -29,3 +31,14 @@ FORMS += \
qnx: target.path = /tmp/$${TARGET}/bin qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target !isEmpty(target.path): INSTALLS += target
LIBS += -L$$PWD/libs/ -lControlCAN
INCLUDEPATH += $$PWD/libs
DEPENDPATH += $$PWD/libs
RESOURCES += \
src/src.qrc

106
CanTool/ControlCAN.h Normal file
View File

@ -0,0 +1,106 @@
#ifndef CONTROLCAN_H
#define CONTROLCAN_H
////文件版本v2.01 20190410
//#include <cvidef.h> //使用CVI平台开发请使用该语句。
//接口卡类型定义
#define VCI_USBCAN1 3
#define VCI_USBCAN2 4
#define VCI_USBCAN2A 4
#define VCI_USBCAN_E_U 20
#define VCI_USBCAN_2E_U 21
#define UINT unsigned int
#define BYTE unsigned char
#define USHORT unsigned short
#define UCHAR unsigned char
#define UINT64 unsigned long long
#define CHAR char
#define DWORD unsigned int
#define ULONG unsigned long
#define PVOID void *
#define INT int
//函数调用返回状态值
#define STATUS_OK 1
#define STATUS_ERR 0
/*------------------------------------------------兼容ZLG的函数及数据类型------------------------------------------------*/
//1.ZLGCAN系列接口卡信息的数据类型。
typedef struct _VCI_BOARD_INFO{
USHORT hw_Version;
USHORT fw_Version;
USHORT dr_Version;
USHORT in_Version;
USHORT irq_Num;
BYTE can_Num;
CHAR str_Serial_Num[20];
CHAR str_hw_Type[40];
USHORT Reserved[4];
} VCI_BOARD_INFO,*PVCI_BOARD_INFO;
//2.定义CAN信息帧的数据类型。
typedef struct _VCI_CAN_OBJ{
UINT ID;
UINT TimeStamp;
BYTE TimeFlag;
BYTE SendType;
BYTE RemoteFlag;//是否是远程帧
BYTE ExternFlag;//是否是扩展帧
BYTE DataLen;
BYTE Data[8];
BYTE Reserved[3];
}VCI_CAN_OBJ,*PVCI_CAN_OBJ;
//3.定义初始化CAN的数据类型
typedef struct _VCI_INIT_CONFIG{
DWORD AccCode;
DWORD AccMask;
DWORD Reserved;
UCHAR Filter;
UCHAR Timing0;
UCHAR Timing1;
UCHAR Mode;
}VCI_INIT_CONFIG,*PVCI_INIT_CONFIG;
///////// new add struct for filter /////////
typedef struct _VCI_FILTER_RECORD{
DWORD ExtFrame; //是否为扩展帧
DWORD Start;
DWORD End;
}VCI_FILTER_RECORD,*PVCI_FILTER_RECORD;
#define EXTERNC extern "C"
EXTERNC DWORD __stdcall VCI_OpenDevice(DWORD DeviceType,DWORD DeviceInd,DWORD Reserved);
EXTERNC DWORD __stdcall VCI_CloseDevice(DWORD DeviceType,DWORD DeviceInd);
EXTERNC DWORD __stdcall VCI_InitCAN(DWORD DeviceType, DWORD DeviceInd, DWORD CANInd, PVCI_INIT_CONFIG pInitConfig);
EXTERNC DWORD __stdcall VCI_ReadBoardInfo(DWORD DeviceType,DWORD DeviceInd,PVCI_BOARD_INFO pInfo);
EXTERNC DWORD __stdcall VCI_SetReference(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,DWORD RefType,PVOID pData);
EXTERNC ULONG __stdcall VCI_GetReceiveNum(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd);
EXTERNC DWORD __stdcall VCI_ClearBuffer(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd);
EXTERNC DWORD __stdcall VCI_StartCAN(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd);
EXTERNC DWORD __stdcall VCI_ResetCAN(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd);
EXTERNC ULONG __stdcall VCI_Transmit(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,PVCI_CAN_OBJ pSend,ULONG Len);
EXTERNC ULONG __stdcall VCI_Receive(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,PVCI_CAN_OBJ pReceive,ULONG Len,INT WaitTime);
/*------------------------------------------------其他补充函数及数据结构描述------------------------------------------------*/
#define EXTERNC extern "C"
EXTERNC DWORD __stdcall VCI_UsbDeviceReset(DWORD DevType,DWORD DevIndex,DWORD Reserved);
EXTERNC DWORD __stdcall VCI_FindUsbDevice2(PVCI_BOARD_INFO pInfo);
#endif

View File

@ -0,0 +1,34 @@
#include "canthread.h"
CANThread::CANThread(QObject *parent) : QObject(parent)
{
}
/* @brief: 打开can设备
* @para: [DWORD] deviceType:
* [DWORD] deviceIdx:
* [DWORD] bandrate:
* @return: [bool] can设备
* true
* false
*/
bool CANThread::openCanDevice(DWORD deviceType, DWORD deviceIdx, DWORD bandrate)
{
m_canDeviceType = deviceType;
m_canDeviceIdx = deviceIdx;
m_canBandrate = bandrate;
DWORD ret = VCI_OpenDevice(m_canDeviceType, m_canDeviceIdx, 0);
if (ret == 1)
{
return true;
}
else
{
qDebug() << "错误代码:" << ret;
return false;
}
}

View File

@ -0,0 +1,28 @@
#ifndef CANTHREAD_H
#define CANTHREAD_H
#include <QObject>
#include <QDebug>
#include "ControlCAN.h"
class CANThread : public QObject
{
Q_OBJECT
public:
explicit CANThread(QObject *parent = nullptr);
bool openCanDevice(uint deviceType, uint deviceIdx, uint bandrate);
private:
DWORD m_canDeviceType; // 设备类型
DWORD m_canDeviceIdx; // 设备索引
DWORD m_canBandrate; // 波特率
signals:
};
#endif // CANTHREAD_H

BIN
CanTool/libs/ControlCAN.dll Normal file

Binary file not shown.

106
CanTool/libs/ControlCAN.h Normal file
View File

@ -0,0 +1,106 @@
#ifndef CONTROLCAN_H
#define CONTROLCAN_H
////文件版本v2.01 20190410
//#include <cvidef.h> //使用CVI平台开发请使用该语句。
//接口卡类型定义
#define VCI_USBCAN1 3
#define VCI_USBCAN2 4
#define VCI_USBCAN2A 4
#define VCI_USBCAN_E_U 20
#define VCI_USBCAN_2E_U 21
#define UINT unsigned int
#define BYTE unsigned char
#define USHORT unsigned short
#define UCHAR unsigned char
#define UINT64 unsigned long long
#define CHAR char
#define DWORD unsigned int
#define ULONG unsigned long
#define PVOID void *
#define INT int
//函数调用返回状态值
#define STATUS_OK 1
#define STATUS_ERR 0
/*------------------------------------------------兼容ZLG的函数及数据类型------------------------------------------------*/
//1.ZLGCAN系列接口卡信息的数据类型。
typedef struct _VCI_BOARD_INFO{
USHORT hw_Version;
USHORT fw_Version;
USHORT dr_Version;
USHORT in_Version;
USHORT irq_Num;
BYTE can_Num;
CHAR str_Serial_Num[20];
CHAR str_hw_Type[40];
USHORT Reserved[4];
} VCI_BOARD_INFO,*PVCI_BOARD_INFO;
//2.定义CAN信息帧的数据类型。
typedef struct _VCI_CAN_OBJ{
UINT ID;
UINT TimeStamp;
BYTE TimeFlag;
BYTE SendType;
BYTE RemoteFlag;//是否是远程帧
BYTE ExternFlag;//是否是扩展帧
BYTE DataLen;
BYTE Data[8];
BYTE Reserved[3];
}VCI_CAN_OBJ,*PVCI_CAN_OBJ;
//3.定义初始化CAN的数据类型
typedef struct _VCI_INIT_CONFIG{
DWORD AccCode;
DWORD AccMask;
DWORD Reserved;
UCHAR Filter;
UCHAR Timing0;
UCHAR Timing1;
UCHAR Mode;
}VCI_INIT_CONFIG,*PVCI_INIT_CONFIG;
///////// new add struct for filter /////////
typedef struct _VCI_FILTER_RECORD{
DWORD ExtFrame; //是否为扩展帧
DWORD Start;
DWORD End;
}VCI_FILTER_RECORD,*PVCI_FILTER_RECORD;
#define EXTERNC extern "C"
EXTERNC DWORD __stdcall VCI_OpenDevice(DWORD DeviceType,DWORD DeviceInd,DWORD Reserved);
EXTERNC DWORD __stdcall VCI_CloseDevice(DWORD DeviceType,DWORD DeviceInd);
EXTERNC DWORD __stdcall VCI_InitCAN(DWORD DeviceType, DWORD DeviceInd, DWORD CANInd, PVCI_INIT_CONFIG pInitConfig);
EXTERNC DWORD __stdcall VCI_ReadBoardInfo(DWORD DeviceType,DWORD DeviceInd,PVCI_BOARD_INFO pInfo);
EXTERNC DWORD __stdcall VCI_SetReference(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,DWORD RefType,PVOID pData);
EXTERNC ULONG __stdcall VCI_GetReceiveNum(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd);
EXTERNC DWORD __stdcall VCI_ClearBuffer(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd);
EXTERNC DWORD __stdcall VCI_StartCAN(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd);
EXTERNC DWORD __stdcall VCI_ResetCAN(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd);
EXTERNC ULONG __stdcall VCI_Transmit(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,PVCI_CAN_OBJ pSend,ULONG Len);
EXTERNC ULONG __stdcall VCI_Receive(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,PVCI_CAN_OBJ pReceive,ULONG Len,INT WaitTime);
/*------------------------------------------------其他补充函数及数据结构描述------------------------------------------------*/
#define EXTERNC extern "C"
EXTERNC DWORD __stdcall VCI_UsbDeviceReset(DWORD DevType,DWORD DevIndex,DWORD Reserved);
EXTERNC DWORD __stdcall VCI_FindUsbDevice2(PVCI_BOARD_INFO pInfo);
#endif

BIN
CanTool/libs/ControlCAN.lib Normal file

Binary file not shown.

View File

@ -6,6 +6,10 @@ MainWindow::MainWindow(QWidget *parent)
, ui(new Ui::MainWindow) , ui(new Ui::MainWindow)
{ {
ui->setupUi(this); ui->setupUi(this);
UI_Init();
Slot_Init();
Var_Init();
} }
MainWindow::~MainWindow() MainWindow::~MainWindow()
@ -13,3 +17,57 @@ MainWindow::~MainWindow()
delete ui; delete ui;
} }
// ======================================================== <初始化>
/* @brief: 变量初始化
* @para:
* @return:
*/
void MainWindow::Var_Init()
{
can_drv = new CANThread();
}
/* @brief: UI初始化
* @para:
* @return:
*/
void MainWindow::UI_Init()
{
setWindowIcon(QIcon(":/img/logo.ico"));
setWindowTitle("CANTool");
}
/* @brief: 槽函数初始化
* @para:
* @return:
*/
void MainWindow::Slot_Init()
{
connect(ui->pushButton_open, &QPushButton::clicked, this, &MainWindow::PushButton_Open_Clicked_Callback);
}
// ======================================================== <槽函数>
void MainWindow::PushButton_Open_Clicked_Callback()
{
qDebug() << "<<< clicked >>> <<<" << sender()->objectName() << ">>>";
DWORD bandrate = ui->comboBox_bandrate->currentText().remove("Kbps").toUInt();
DWORD idx = ui->comboBox_typeIdx->currentText().toInt();
bool ret = can_drv->openCanDevice(4, // 4: USBCAN-2A、USBCAN-2C、CANalyst-II系列、MiniPCIe-CAN、汽车OBDII专用版
idx, // 设备号
bandrate);
if (ret == true)
{
qDebug() << "can设备打开成功";
}
else
{
qDebug() << "can设备打开失败";
QMessageBox msgBox;
msgBox.setWindowTitle("错误");
msgBox.setText("CAN设备打开失败");
msgBox.setIcon(QMessageBox::Warning);
msgBox.exec();
}
}

View File

@ -2,6 +2,11 @@
#define MAINWINDOW_H #define MAINWINDOW_H
#include <QMainWindow> #include <QMainWindow>
#include <QDebug>
#include <QMessageBox>
#include "app/CANThread/canthread.h"
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; } namespace Ui { class MainWindow; }
@ -15,7 +20,16 @@ public:
MainWindow(QWidget *parent = nullptr); MainWindow(QWidget *parent = nullptr);
~MainWindow(); ~MainWindow();
void Var_Init(); // 变量初始化
void UI_Init(); // UI界面初始化
void Slot_Init(); // 槽函数初始化
private: private:
Ui::MainWindow *ui; Ui::MainWindow *ui;
CANThread* can_drv;
private slots: // 槽函数
void PushButton_Open_Clicked_Callback();
}; };
#endif // MAINWINDOW_H #endif // MAINWINDOW_H

View File

@ -6,15 +6,388 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>800</width> <width>1605</width>
<height>600</height> <height>950</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>MainWindow</string> <string>MainWindow</string>
</property> </property>
<widget class="QWidget" name="centralwidget"/> <widget class="QWidget" name="centralwidget">
<widget class="QMenuBar" name="menubar"/> <widget class="QGroupBox" name="groupBox_can">
<property name="geometry">
<rect>
<x>30</x>
<y>140</y>
<width>1541</width>
<height>741</height>
</rect>
</property>
<property name="title">
<string>CAN</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QTableWidget" name="tableWidget_data">
<column>
<property name="text">
<string>序号</string>
</property>
</column>
<column>
<property name="text">
<string>传输方向</string>
</property>
</column>
<column>
<property name="text">
<string>新建列</string>
</property>
</column>
<column>
<property name="text">
<string>状态</string>
</property>
</column>
<column>
<property name="text">
<string>名称</string>
</property>
</column>
<column>
<property name="text">
<string>新建列</string>
</property>
</column>
<column>
<property name="text">
<string>格式</string>
</property>
</column>
<column>
<property name="text">
<string>新建列</string>
</property>
</column>
<column>
<property name="text">
<string>类型</string>
</property>
</column>
<column>
<property name="text">
<string>数据</string>
</property>
</column>
<column>
<property name="text">
<string>解码</string>
</property>
</column>
<column>
<property name="text">
<string>注释</string>
</property>
</column>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="">
<property name="geometry">
<rect>
<x>30</x>
<y>10</y>
<width>320</width>
<height>119</height>
</rect>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QGridLayout" name="gridLayout" columnstretch="3,5" columnminimumwidth="3,5">
<property name="horizontalSpacing">
<number>20</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label_type">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>设备类型:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="comboBox_type">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<item>
<property name="text">
<string>USBCAN-2A</string>
</property>
</item>
<item>
<property name="text">
<string>USBCAN-2C</string>
</property>
</item>
<item>
<property name="text">
<string>CANalyst-II</string>
</property>
</item>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_typeIdx">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>设备索引:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="comboBox_typeIdx">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<item>
<property name="text">
<string>0</string>
</property>
</item>
<item>
<property name="text">
<string>1</string>
</property>
</item>
<item>
<property name="text">
<string>2</string>
</property>
</item>
<item>
<property name="text">
<string>3</string>
</property>
</item>
<item>
<property name="text">
<string>4</string>
</property>
</item>
<item>
<property name="text">
<string>5</string>
</property>
</item>
<item>
<property name="text">
<string>6</string>
</property>
</item>
<item>
<property name="text">
<string>7</string>
</property>
</item>
<item>
<property name="text">
<string>8</string>
</property>
</item>
<item>
<property name="text">
<string>9</string>
</property>
</item>
<item>
<property name="text">
<string>10</string>
</property>
</item>
<item>
<property name="text">
<string>11</string>
</property>
</item>
<item>
<property name="text">
<string>12</string>
</property>
</item>
<item>
<property name="text">
<string>13</string>
</property>
</item>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_bandrate">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>波特率:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="comboBox_bandrate">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<item>
<property name="text">
<string>10Kbps</string>
</property>
</item>
<item>
<property name="text">
<string>20Kbps</string>
</property>
</item>
<item>
<property name="text">
<string>40Kbps</string>
</property>
</item>
<item>
<property name="text">
<string>50Kbps</string>
</property>
</item>
<item>
<property name="text">
<string>80Kbps</string>
</property>
</item>
<item>
<property name="text">
<string>100Kbps</string>
</property>
</item>
<item>
<property name="text">
<string>125Kbps</string>
</property>
</item>
<item>
<property name="text">
<string>200Kbps</string>
</property>
</item>
<item>
<property name="text">
<string>250Kbps</string>
</property>
</item>
<item>
<property name="text">
<string>400Kbps</string>
</property>
</item>
<item>
<property name="text">
<string>500Kbps</string>
</property>
</item>
<item>
<property name="text">
<string>666Kbps</string>
</property>
</item>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QPushButton" name="pushButton_open">
<property name="text">
<string>打开设备</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_close">
<property name="text">
<string>关闭设备</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="pushButton_roll">
<property name="maximumSize">
<size>
<width>80</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>滚动刷新</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</widget>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1605</width>
<height>25</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/> <widget class="QStatusBar" name="statusbar"/>
</widget> </widget>
<resources/> <resources/>

BIN
CanTool/src/img/logo.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

5
CanTool/src/src.qrc Normal file
View File

@ -0,0 +1,5 @@
<RCC>
<qresource prefix="/">
<file>img/logo.ico</file>
</qresource>
</RCC>