完成部分程序接收和线程信号和槽的逻辑

This commit is contained in:
mhvhm 2024-09-14 00:34:37 +08:00
parent b5c927d71a
commit a6e9af706c
6 changed files with 280 additions and 11 deletions

View File

@ -20,8 +20,143 @@ bool CANThread::openCanDevice(DWORD deviceType, DWORD deviceIdx, DWORD bandrate)
m_canDeviceIdx = deviceIdx;
m_canBandrate = bandrate;
// 1. 打开can设备
DWORD ret = VCI_OpenDevice(m_canDeviceType, m_canDeviceIdx, 0);
if (ret != 1)
{
qDebug() << "[OpenDevice]错误代码:" << ret;
return false;
}
// 2. 初始化can
VCI_INIT_CONFIG config;
config.AccCode = 0x80000008; // 验收码
config.AccMask = 0xFFFFFFFF; // 屏蔽码
config.Filter = 1; // 滤波方式-接收所有类型
config.Mode = 0; // 工作模式-正常工作
// 根据波特率初始化定时器
switch (m_canBandrate) {
case 10:
config.Timing0=0x31;
config.Timing1=0x1c;
break;
case 20:
config.Timing0=0x18;
config.Timing1=0x1c;
break;
case 40:
config.Timing0=0x87;
config.Timing1=0xff;
break;
case 50:
config.Timing0=0x09;
config.Timing1=0x1c;
break;
case 80:
config.Timing0=0x83;
config.Timing1=0xff;
break;
case 100:
config.Timing0=0x04;
config.Timing1=0x1c;
break;
case 125:
config.Timing0=0x03;
config.Timing1=0x1c;
break;
case 200:
config.Timing0=0x81;
config.Timing1=0xfa;
break;
case 250:
config.Timing0=0x01;
config.Timing1=0x1c;
break;
case 400:
config.Timing0=0x80;
config.Timing1=0xfa;
break;
case 500:
config.Timing0=0x00;
config.Timing1=0x1c;
break;
case 666:
config.Timing0=0x80;
config.Timing1=0xb6;
break;
case 800:
config.Timing0=0x00;
config.Timing1=0x16;
break;
case 1000:
config.Timing0=0x00;
config.Timing1=0x14;
break;
case 33:
config.Timing0=0x09;
config.Timing1=0x6f;
break;
case 66:
config.Timing0=0x04;
config.Timing1=0x6f;
break;
case 83:
config.Timing0=0x03;
config.Timing1=0x6f;
break;
default:
break;
}
ret = VCI_InitCAN(m_canDeviceType, m_canDeviceIdx, CAN_1, &config);
if (ret != 1)
{
qDebug() << "[InitCAN]错误代码:" << ret;
return false;
}
ret = VCI_InitCAN(m_canDeviceType, m_canDeviceIdx, CAN_2, &config);
if (ret != 1)
{
qDebug() << "[InitCAN]错误代码:" << ret;
return false;
}
// // 3. 读取can设备信息
// VCI_BOARD_INFO info;
// ret = VCI_ReadBoardInfo(m_canDeviceType, m_canDeviceIdx, &info);
// if (ret != 1)
// {
// qDebug() << "[ReadBoardInfo]错误代码:" << ret;
// return false;
// }
// 4. 启动can
ret = VCI_StartCAN(m_canDeviceType, m_canDeviceIdx, CAN_1);
if (ret != 1)
{
qDebug() << "[StartCAN1]错误代码:" << ret;
return false;
}
ret = VCI_StartCAN(m_canDeviceType, m_canDeviceIdx, CAN_2);
if (ret != 1)
{
qDebug() << "[StartCAN2]错误代码:" << ret;
return false;
}
return true;
}
/* @brief: 关闭can设备
* @para:
* @return:
*/
bool CANThread::closeCanDevice()
{
DWORD ret = VCI_CloseDevice(m_canDeviceType, m_canDeviceIdx);
if (ret == 1)
{
return true;
@ -32,3 +167,26 @@ bool CANThread::openCanDevice(DWORD deviceType, DWORD deviceIdx, DWORD bandrate)
return false;
}
}
/* @brief: 线程执行函数
* @para:
* @return:
*/
void CANThread::doThreadWork()
{
VCI_CAN_OBJ data[CAN_RECV_BUF_SISE]; // 接收缓存
DWORD ret;
while (1)
{
ret = VCI_Receive(m_canDeviceType, m_canDeviceIdx, CAN_1, data, CAN_RECV_BUF_SISE, 0);
if (ret != -1)
{
emit recvFinished(data, ret, CAN_1);
}
ret = VCI_Receive(m_canDeviceType, m_canDeviceIdx, CAN_2, data, CAN_RECV_BUF_SISE, 0);
if (ret != -1)
{
emit recvFinished(data, ret, CAN_2);
}
}
}

View File

@ -6,20 +6,33 @@
#include "ControlCAN.h"
#define CAN_RECV_BUF_SISE (2500)
typedef enum
{
CAN_1 = 0,
CAN_2,
}CAN_x;
class CANThread : public QObject
{
Q_OBJECT
public:
explicit CANThread(QObject *parent = nullptr);
bool openCanDevice(uint deviceType, uint deviceIdx, uint bandrate);
bool openCanDevice(DWORD deviceType, DWORD deviceIdx, DWORD bandrate);
bool closeCanDevice();
private:
DWORD m_canDeviceType; // 设备类型
DWORD m_canDeviceIdx; // 设备索引
DWORD m_canBandrate; // 波特率
signals:
void recvFinished(VCI_CAN_OBJ *data, DWORD retNum, CAN_x canChl);
public slots:
void doThreadWork(); // 线程执行函数
};

View File

@ -7,9 +7,9 @@ MainWindow::MainWindow(QWidget *parent)
{
ui->setupUi(this);
Var_Init();
UI_Init();
Slot_Init();
Var_Init();
}
MainWindow::~MainWindow()
@ -17,6 +17,32 @@ MainWindow::~MainWindow()
delete ui;
}
/* @brief: UI-打开设备
* @para:
* @return:
*/
void MainWindow::UI_OpenCanDevice()
{
ui->pushButton_open->setEnabled(false);
ui->pushButton_close->setEnabled(true);
ui->comboBox_type->setEnabled(false);
ui->comboBox_typeIdx->setEnabled(false);
ui->comboBox_bandrate->setEnabled(false);
}
/* @brief: UI-关闭设备
* @para:
* @return:
*/
void MainWindow::UI_CloseCanDevice()
{
ui->pushButton_open->setEnabled(true);
ui->pushButton_close->setEnabled(false);
ui->comboBox_type->setEnabled(true);
ui->comboBox_typeIdx->setEnabled(true);
ui->comboBox_bandrate->setEnabled(true);
}
// ======================================================== <初始化>
/* @brief: 变量初始化
* @para:
@ -25,6 +51,9 @@ MainWindow::~MainWindow()
void MainWindow::Var_Init()
{
can_drv = new CANThread();
recvThread = new QThread();
can_drv->moveToThread(recvThread); // 转移到线程中运行
}
/* @brief: UI初始化
@ -35,6 +64,17 @@ void MainWindow::UI_Init()
{
setWindowIcon(QIcon(":/img/logo.ico"));
setWindowTitle("CANTool");
UI_CloseCanDevice();
if (isRolling == true)
{
ui->radioButton_roll->setChecked(true);
}
else
{
ui->radioButton_roll->setChecked(false);
}
}
/* @brief: 槽函数初始化
@ -44,12 +84,18 @@ void MainWindow::UI_Init()
void MainWindow::Slot_Init()
{
connect(ui->pushButton_open, &QPushButton::clicked, this, &MainWindow::PushButton_Open_Clicked_Callback);
connect(ui->pushButton_close, &QPushButton::clicked, this, &MainWindow::PushButton_Close_Clicked_Callback);
connect(ui->radioButton_roll, &QRadioButton::clicked, this, &MainWindow::RadioButton_Roll_Clicked_Callback);
connect(recvThread, &QThread::started, can_drv, &CANThread::doThreadWork);
connect(can_drv, &CANThread::recvFinished, this, &MainWindow::getCanRecvData);
}
// ======================================================== <槽函数>
void MainWindow::PushButton_Open_Clicked_Callback()
{
qDebug() << "<<< clicked >>> <<<" << sender()->objectName() << ">>>";
qDebug() << "<<<clicked>>> <<<" << sender()->objectName() << ">>>";
DWORD bandrate = ui->comboBox_bandrate->currentText().remove("Kbps").toUInt();
DWORD idx = ui->comboBox_typeIdx->currentText().toInt();
@ -60,6 +106,8 @@ void MainWindow::PushButton_Open_Clicked_Callback()
if (ret == true)
{
qDebug() << "can设备打开成功";
UI_OpenCanDevice();
recvThread->start();
}
else
{
@ -71,3 +119,41 @@ void MainWindow::PushButton_Open_Clicked_Callback()
msgBox.exec();
}
}
void MainWindow::PushButton_Close_Clicked_Callback()
{
qDebug() << "<<<clicked>>> <<<" << sender()->objectName() << ">>>";
bool ret = can_drv->closeCanDevice();
if (ret == true)
{
qDebug() << "can设备关闭成功";
UI_CloseCanDevice();
}
else
{
qDebug() << "can设备关闭失败";
QMessageBox msgBox;
msgBox.setWindowTitle("错误");
msgBox.setText("CAN设备关闭失败");
msgBox.setIcon(QMessageBox::Warning);
msgBox.exec();
}
}
void MainWindow::RadioButton_Roll_Clicked_Callback()
{
qDebug() << "<<<clicked>>> <<<" << sender()->objectName() << ">>>";
isRolling = ui->radioButton_roll->isChecked();
qDebug() << "isRolling" << isRolling;
}
void MainWindow::getCanRecvData(VCI_CAN_OBJ *data, DWORD retNum, CAN_x canChl)
{
qDebug() << "<<<recvCanData>>> <<<" << sender()->objectName() << ">>>";
for (DWORD i = 0; i < retNum; i++)
{
}
}

View File

@ -4,7 +4,7 @@
#include <QMainWindow>
#include <QDebug>
#include <QMessageBox>
#include <QThread>
#include "app/CANThread/canthread.h"
@ -27,9 +27,20 @@ public:
private:
Ui::MainWindow *ui;
CANThread* can_drv;
QThread* recvThread;
bool isRolling = true; // 是否滚动显示
void UI_OpenCanDevice();
void UI_CloseCanDevice();
private slots: // 槽函数
void PushButton_Open_Clicked_Callback();
void PushButton_Close_Clicked_Callback();
void RadioButton_Roll_Clicked_Callback();
void getCanRecvData(VCI_CAN_OBJ *data, DWORD retNum, CAN_x canChl);
};
#endif // MAINWINDOW_H

View File

@ -93,13 +93,13 @@
</item>
</layout>
</widget>
<widget class="QWidget" name="">
<widget class="QWidget" name="layoutWidget">
<property name="geometry">
<rect>
<x>30</x>
<y>10</y>
<width>320</width>
<height>119</height>
<width>402</width>
<height>123</height>
</rect>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_3">
@ -352,22 +352,22 @@
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<width>50</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="pushButton_roll">
<widget class="QRadioButton" name="radioButton_roll">
<property name="maximumSize">
<size>
<width>80</width>
<width>100</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>滚动刷新</string>
<string>刷新显示</string>
</property>
</widget>
</item>

View File

@ -6,5 +6,6 @@
| 更新时间 | 更新内容 |
| ---------- | ------------------------------------------------------------ |
| 2024-09-14 | 1. 完成部分程序接收和线程信号和槽的逻辑<br> |
| 2024-09-13 | 1.完成工程创建<br>2. 完成程序图标设置<br>3. 完成dll动态库的加入<br>4. 完成can设备的打开函数<br> |