完成部分程序接收和线程信号和槽的逻辑
This commit is contained in:
parent
b5c927d71a
commit
a6e9af706c
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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(); // 线程执行函数
|
||||
|
||||
};
|
||||
|
||||
|
|
|
@ -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++)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue
Block a user