Qt使用usbcan通信

ops/2024/11/9 16:45:24/

usbcan_0">一.usbcan环境搭建

可以参照我的这篇博客:USBCAN-II/II+使用方法以及qt操作介绍

二.项目效果展示

在这里插入图片描述

三.项目代码

  • 这部分代码仅仅展示了部分功能,仅供参考。
#include"ControlCAN.h"
#include<QDebug>
#include <windows.h>
#include<stdio.h>
#include"reveivethread.h"
#include<QVector>#define DEVICE_TYPE 4    // 设备类型
#define DEVICE_INDEX 0   // 设备索引
#define CAN_INDEX 0      // CAN 通道索引1
#define CAN_INDEX2 1      // CAN 通道索引2MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);Init_Connect();
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_start_clicked()
{ui->textEdit->clear();// 初始化CAN设备//VCI_OpenDevice(DWORD DeviceType,DWORD DeviceInd,DWORD Reserved)if (VCI_OpenDevice(DEVICE_TYPE, DEVICE_INDEX, 0) == 0){qDebug()<<"Device open fail!";ui->textEdit->append("Device open fail!");return ;}else{qDebug()<<"Device open successful!";ui->textEdit->append("Device open successful!");}// 初始化配置结构VCI_INIT_CONFIG initConfig;initConfig.AccCode = 0x00000000;  // 接收过滤器initConfig.AccMask = 0xFFFFFFFF;   // 接收掩码initConfig.Filter = 0;              // 过滤器类型initConfig.Timing0 = 0x00;          // 时间参数initConfig.Timing1 = 0x14;          // 时间参数initConfig.Mode = 0;                 // 工作模式// 设置CAN通道1//VCI_InitCAN(DWORD DeviceType, DWORD DeviceInd, DWORD CANInd, PVCI_INIT_CONFIG pInitConfig);if (VCI_InitCAN(DEVICE_TYPE, DEVICE_INDEX, CAN_INDEX, &initConfig) == 0) {//printf("初始化CAN通道失败!\n");qDebug()<<"InitCAN 1 fail!";ui->textEdit->append("InitCAN 1 fail!");return ;}else{qDebug()<<"InitCAN 1 successful!";ui->textEdit->append("InitCAN 1 successful!");}// 设置CAN通道2//VCI_InitCAN(DWORD DeviceType, DWORD DeviceInd, DWORD CANInd, PVCI_INIT_CONFIG pInitConfig);if (VCI_InitCAN(DEVICE_TYPE, DEVICE_INDEX, CAN_INDEX2, &initConfig) == 0) {//printf("初始化CAN通道失败!\n");qDebug()<<"InitCAN 2 fail!";ui->textEdit->append("InitCAN 2 fail!");return ;}else{qDebug()<<"InitCAN 2 successful!";ui->textEdit->append("InitCAN 2 successful!");}// 启动CAN通道1if (VCI_StartCAN(DEVICE_TYPE, DEVICE_INDEX, CAN_INDEX) == 0) {//printf("启动CAN通道失败!\n ");qDebug()<<"StartCAN 1 fail!";ui->textEdit->append("StartCAN 1 fail!");return ;}else{qDebug()<<"StartCAN 1 successful!";ui->textEdit->append("StartCAN 1 successful!");}// 启动CAN通道2if (VCI_StartCAN(DEVICE_TYPE, DEVICE_INDEX, CAN_INDEX2) == 0) {//printf("启动CAN通道失败!\n ");qDebug()<<"StartCAN 2 fail!";ui->textEdit->append("StartCAN 2 fail!");return ;}else{qDebug()<<"StartCAN 2 successful!";ui->textEdit->append("StartCAN 2 successful!");}}void MainWindow::on_pushButton_close_clicked()
{// 关闭设备if(VCI_CloseDevice(DEVICE_TYPE, DEVICE_INDEX)){qDebug()<<"CloseDevice successful!";ui->textEdit->append("CloseDevice successful!");}else{qDebug()<<"CloseDevice fail!";ui->textEdit->append("CloseDevice fail!");}//关闭线程//rev.wait();
}void MainWindow::on_pushButton_clear_clicked()
{ui->textEdit->clear();
}void MainWindow::on_pushButton_send_clicked()
{//QString str=("01 02 03 04 05 06 07 08");//现在需要的请求是需要将每个字节都正确的发送出来以0x01的形式// 输入串QString str = ui->lineEdit->text();QStringList hexValues = str.split(" ");  // 使用空格分割字符串//存放16进制数字QVector<int>Int_16;// 遍历每个十六进制值并格式化输出for (const QString &value : hexValues){bool ok;int number = value.toInt(&ok, 16); // 将十六进制字符串转换为整数Int_16.push_back(number);if (ok){qDebug() << QString("0x%1").arg(number, 2, 16, QLatin1Char('0')).toUpper(); // 格式化为0x形式并打印} else{qDebug() << "Invalid hex value:" << value; // 错误处理}}VCI_CAN_OBJ vco;// 定义两帧的结构体数组// 中间略去其他函数代码vco.ID = 0x00000001;// 填写第一帧的IDvco.SendType = 0;// 正常发送模式vco.RemoteFlag = 0;// 数据帧vco.ExternFlag = 0;// 标准帧vco.DataLen = 8;// 数据长度1个字节//vco.Data[0] = number;// 数据0为0x66,十进制102//将结果存入到Data中for(int i=0;i<8;i++){vco.Data[i]=Int_16[i];}DWORD dwRel = VCI_Transmit(DEVICE_TYPE, DEVICE_INDEX, CAN_INDEX, &vco, 1); // 发送1帧if(dwRel){qDebug()<<"nCANInd 1 transmit successful,dwRel="<<dwRel;ui->textEdit->append("nCANInd 1 transmit successful,dwRel= "+QString::number(dwRel));}else{qDebug()<<"nCANInd 1 transmit fail";ui->textEdit->append("nCANInd 1 transmit fail");}rev.start();rev.current_strart();//rev.sleep(1);rev.wait();//rev.stop();
}

http://www.ppmy.cn/ops/100203.html

相关文章

23种设计模式之工厂模式

文章目录 工厂模式工厂模式经典案例工厂模式分类与优缺点工厂模式的使用场景工厂模式的优点简单工厂模式实现工厂方法模式实现抽象工厂模式实现 工厂模式 工厂模式是一种创建对象的设计模式&#xff0c;将对象的创建和使用分离&#xff0c;可提高代码可维护性、可扩展性&#…

C++实现的爬楼梯问题

爬楼梯问题是什么 爬楼梯问题是一个经典的动态规划问题&#xff0c;通常被用于学习和理解递归与动态规划的基本概念。问题的描述是&#xff1a;假设有一个楼梯&#xff0c;总共有n级台阶&#xff0c;你每次可以爬1级或2级台阶&#xff0c;问有多少种不同的方式可以爬到楼顶。 …

C# Hashtable

目录 Hashtalbe的本质 申明 增 删 查 改 遍历 Hashtalbe的本质 Hashtable&#xff08;又称散列表&#xff09; 是基于键的哈希代码组织起来的 键/值对 它的主要作用是提高数据查询的效率 使用键来访问集合中的元素 申明 需要引用命名空间 System.Collectio…

Spring Cloud Stream与Kafka(一)

Spring Cloud Stream与Kafka&#xff08;一&#xff09; ​ 在实际开发过程中&#xff0c;消息中间件用于解决应用解耦&#xff0c;异步消息&#xff0c;流量削峰等问题&#xff0c;实现高可用、高性能、可伸缩和最终一致性架构。不同的消息中间件实现方式不同&#xff0c;内部…

【Go - 每日一小问: 对未初始化的的 chan 进行读写,会怎么样?为什么?】

对未初始化的 chan 进行读写会有不同的行为&#xff1a; 1. 对未初始化的 chan 进行读取 读取操作&#xff1a; 对未初始化的 chan 进行读取操作会导致永久阻塞&#xff08;deadlock&#xff09;&#xff0c;因为没有任何 goroutine 可以向这个 chan 发送数据。读取操作会一直…

【C++】01背包问题暴力,记忆,动态规划解法

0-1 背包问题详解与实现 目录 0-1 背包问题详解与实现问题描述问题分析状态定义状态转移方程边界条件算法实现暴力搜索记忆化搜索动态规划空间优化 总结思维导图C学习资源 问题描述 在算法领域&#xff0c;0-1背包问题是一个经典的优化问题。给定一个背包和一个物品集合&#…

【国产游戏行业的崛起与挑战:技术革新与全球市场机遇】

近年来&#xff0c;国产游戏行业确实取得了显著的发展&#xff0c;不仅在技术水平上不断提升&#xff0c;而且在国际市场上也崭露头角。然而&#xff0c;面对全球游戏市场的激烈竞争&#xff0c;国产游戏技术仍面临一些挑战和机遇。 首先&#xff0c;国产游戏在原创IP方面存在…

进阶岛 茴香豆:企业级知识库问答工具

一、任务介绍 在 InternStudio 中利用 Internlm2-7b 搭建标准版茴香豆知识助手&#xff0c;并使用 Gradio 界面完成 2 轮问答&#xff08;问题不可与教程重复&#xff0c;作业截图需包括 gradio 界面问题和茴香豆回答&#xff09;。知识库可根据根据自己工作、学习或感兴趣的内…