diff --git a/CanTool/CanTool.pro b/CanTool/CanTool.pro index 0086fd6..9a0d769 100644 --- a/CanTool/CanTool.pro +++ b/CanTool/CanTool.pro @@ -16,10 +16,12 @@ DEFINES += QT_DEPRECATED_WARNINGS #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ + app/CANThread/canthread.cpp \ main.cpp \ mainwindow.cpp HEADERS += \ + app/CANThread/canthread.h \ mainwindow.h FORMS += \ @@ -29,3 +31,14 @@ FORMS += \ qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target + + +LIBS += -L$$PWD/libs/ -lControlCAN + + +INCLUDEPATH += $$PWD/libs +DEPENDPATH += $$PWD/libs + +RESOURCES += \ + src/src.qrc + diff --git a/CanTool/ControlCAN.h b/CanTool/ControlCAN.h new file mode 100644 index 0000000..acf2c1c --- /dev/null +++ b/CanTool/ControlCAN.h @@ -0,0 +1,106 @@ +#ifndef CONTROLCAN_H +#define CONTROLCAN_H + +////文件版本:v2.01 20190410 +//#include //使用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 diff --git a/CanTool/app/CANThread/canthread.cpp b/CanTool/app/CANThread/canthread.cpp new file mode 100644 index 0000000..bba2ba3 --- /dev/null +++ b/CanTool/app/CANThread/canthread.cpp @@ -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() << "閿欒浠g爜锛" << ret; + return false; + } +} diff --git a/CanTool/app/CANThread/canthread.h b/CanTool/app/CANThread/canthread.h new file mode 100644 index 0000000..1666341 --- /dev/null +++ b/CanTool/app/CANThread/canthread.h @@ -0,0 +1,28 @@ +#ifndef CANTHREAD_H +#define CANTHREAD_H + +#include +#include + +#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 diff --git a/CanTool/libs/ControlCAN.dll b/CanTool/libs/ControlCAN.dll new file mode 100644 index 0000000..7d8b06b Binary files /dev/null and b/CanTool/libs/ControlCAN.dll differ diff --git a/CanTool/libs/ControlCAN.h b/CanTool/libs/ControlCAN.h new file mode 100644 index 0000000..acf2c1c --- /dev/null +++ b/CanTool/libs/ControlCAN.h @@ -0,0 +1,106 @@ +#ifndef CONTROLCAN_H +#define CONTROLCAN_H + +////文件版本:v2.01 20190410 +//#include //使用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 diff --git a/CanTool/libs/ControlCAN.lib b/CanTool/libs/ControlCAN.lib new file mode 100644 index 0000000..b0bc86d Binary files /dev/null and b/CanTool/libs/ControlCAN.lib differ diff --git a/CanTool/mainwindow.cpp b/CanTool/mainwindow.cpp index 41a26bd..79ee920 100644 --- a/CanTool/mainwindow.cpp +++ b/CanTool/mainwindow.cpp @@ -6,6 +6,10 @@ MainWindow::MainWindow(QWidget *parent) , ui(new Ui::MainWindow) { ui->setupUi(this); + + UI_Init(); + Slot_Init(); + Var_Init(); } MainWindow::~MainWindow() @@ -13,3 +17,57 @@ MainWindow::~MainWindow() 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銆乁SBCAN-2C銆丆ANalyst-II绯诲垪銆丮iniPCIe-CAN銆佹苯杞BDII涓撶敤鐗 + idx, // 璁惧鍙 + bandrate); + if (ret == true) + { + qDebug() << "can璁惧鎵撳紑鎴愬姛"; + } + else + { + qDebug() << "can璁惧鎵撳紑澶辫触"; + QMessageBox msgBox; + msgBox.setWindowTitle("閿欒"); + msgBox.setText("CAN璁惧鎵撳紑澶辫触"); + msgBox.setIcon(QMessageBox::Warning); + msgBox.exec(); + } +} diff --git a/CanTool/mainwindow.h b/CanTool/mainwindow.h index 4643e32..5b49424 100644 --- a/CanTool/mainwindow.h +++ b/CanTool/mainwindow.h @@ -2,6 +2,11 @@ #define MAINWINDOW_H #include +#include +#include + + +#include "app/CANThread/canthread.h" QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } @@ -15,7 +20,16 @@ public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); + void Var_Init(); // 鍙橀噺鍒濆鍖 + void UI_Init(); // UI鐣岄潰鍒濆鍖 + void Slot_Init(); // 妲藉嚱鏁板垵濮嬪寲 + private: Ui::MainWindow *ui; + CANThread* can_drv; + + +private slots: // 妲藉嚱鏁 + void PushButton_Open_Clicked_Callback(); }; #endif // MAINWINDOW_H diff --git a/CanTool/mainwindow.ui b/CanTool/mainwindow.ui index b232854..f341a4a 100644 --- a/CanTool/mainwindow.ui +++ b/CanTool/mainwindow.ui @@ -6,15 +6,388 @@ 0 0 - 800 - 600 + 1605 + 950 MainWindow - - + + + + + 30 + 140 + 1541 + 741 + + + + CAN + + + + + + + 搴忓彿 + + + + + 浼犺緭鏂瑰悜 + + + + + 鏂板缓鍒 + + + + + 鐘舵 + + + + + 鍚嶇О + + + + + 鏂板缓鍒 + + + + + 鏍煎紡 + + + + + 鏂板缓鍒 + + + + + 绫诲瀷 + + + + + 鏁版嵁 + + + + + 瑙g爜 + + + + + 娉ㄩ噴 + + + + + + + + + + 30 + 10 + 320 + 119 + + + + + + + + + 20 + + + + + + 0 + 0 + + + + 璁惧绫诲瀷锛 + + + + + + + + 0 + 0 + + + + + USBCAN-2A + + + + + USBCAN-2C + + + + + CANalyst-II + + + + + + + + + 0 + 0 + + + + 璁惧绱㈠紩锛 + + + + + + + + 0 + 0 + + + + + 0 + + + + + 1 + + + + + 2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + 8 + + + + + 9 + + + + + 10 + + + + + 11 + + + + + 12 + + + + + 13 + + + + + + + + + 0 + 0 + + + + 娉㈢壒鐜囷細 + + + + + + + + 0 + 0 + + + + + 10Kbps + + + + + 20Kbps + + + + + 40Kbps + + + + + 50Kbps + + + + + 80Kbps + + + + + 100Kbps + + + + + 125Kbps + + + + + 200Kbps + + + + + 250Kbps + + + + + 400Kbps + + + + + 500Kbps + + + + + 666Kbps + + + + + + + + + + + + 鎵撳紑璁惧 + + + + + + + 鍏抽棴璁惧 + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + + + 80 + 16777215 + + + + 婊氬姩鍒锋柊 + + + + + + + + + + + + + + 0 + 0 + 1605 + 25 + + + diff --git a/CanTool/src/img/logo.ico b/CanTool/src/img/logo.ico new file mode 100644 index 0000000..dd1e564 Binary files /dev/null and b/CanTool/src/img/logo.ico differ diff --git a/CanTool/src/src.qrc b/CanTool/src/src.qrc new file mode 100644 index 0000000..8a394e6 --- /dev/null +++ b/CanTool/src/src.qrc @@ -0,0 +1,5 @@ + + + img/logo.ico + +