Qt使用usbcan通信

news/2024/9/13 4:01:41/ 标签: qt, 命令模式, 开发语言, usbcan

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/news/1516426.html

相关文章

《Clean Code《代码整洁之道》解读

《Clean Code》&#xff08;《代码整洁之道》&#xff09;是软件开发领域的经典著作&#xff0c;由知名软件工程师Robert C. Martin&#xff08;又称"Uncle Bob"&#xff09;编写。本书详细探讨了如何编写整洁、易于维护、可读性强的代码。对于任何软件项目的长期维护…

el-form只对rules中个别字段进行校验

正常属性校验方式 const moveToErr () > {const errorDom document.getElementsByClassName(el-form-item__error);console.log(errorDom)if (errorDom.length) {errorDom[0].scrollIntoView({block: center,behavior: smooth})} };const saveItem async (formEl?: For…

机器学习——决策树,朴素贝叶斯

一.决策树 决策树中的基尼系数&#xff08;Gini Index&#xff09;是用于衡量数据集中不纯度&#xff08;或混杂度&#xff09;的指标。基尼系数的取值范围在0到0.5之间&#xff0c;其中0表示数据完全纯&#xff08;同一类别&#xff09;&#xff0c;0.5表示数据完全混杂。 基…

linux下部署数据库总结

数据库 数据库主要分为两大类&#xff1a;关系型数据库与 NoSQL 数据库 关系型数据库&#xff0c;是建立在关系模型基础上的数据库&#xff0c;其借助于集合代数等数学概念和方法来处理数据库 中的数据主流的 MySQL、Oracle、MS SQL Server 和 DB2 都属于这类传统数据库。 NoSQ…

大数据挖掘的步骤是怎样的呢?

大数据挖掘是一个复杂而系统的过程&#xff0c;它利用计算机科学的方法和技术&#xff0c;对大量、多样化、高速增长的数据进行深入挖掘&#xff0c;以发现有价值的信息和知识。以下是大数据挖掘的主要步骤和方法&#xff1a; 一、大数据挖掘的步骤 数据收集&#xff1a; 从各…

[Meachines] [Easy] BoardLight Dolibarr17.0.0-RCE+Enlightenment v0.25.3权限提升

信息收集 IP AddressOpening Ports10.10.11.11TCP:22,80 $ nmap -p- 10.10.11.11 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 3072 06:2…

【Java】IDEA从零到一使用statemachine状态机模拟订单 (图解)

Java系列文章目录 补充内容 Windows通过SSH连接Linux 第一章 Linux基本命令的学习与Linux历史 文章目录 Java系列文章目录一、前言二、学习内容&#xff1a;三、问题描述四、解决方案&#xff1a;4.1 认识依赖4.2 使用状态机4.2.1 目录结构4.2.2 状态机解析4.2.2.1 概念4.2.2.…

【Python游戏】Joystick游戏手柄编程介绍

本文收录于 《一起学Python趣味编程》专栏&#xff0c;从零基础开始&#xff0c;分享一些Python编程知识&#xff0c;欢迎关注&#xff0c;谢谢&#xff01; 文章目录 一、前言二、正式开始2.1 认识游戏手柄结构2.2 了解pygame.joystick模块简单使用步骤2.3 了解pygame.joystic…

USB详解,配置及难点

一、USB发展历史 二、USB简介 USB有USB1.0/1.1/2.0/3.0多个版本&#xff0c;标准USB由4根线组成,VCC&#xff0c;GND&#xff0c;D&#xff0c;D-&#xff0c;其中D和D-是数据线&#xff0c;采用差分传输。在USB主机上,D-和D都是接了15K的电阻到地,所以在没有设备接入的时候,D、…

网络安全场景化解决方案编写教程(大纲)

目录 1.概述 1.1.项目背景 1.2.项目现状 1.3.项目目标 2.需求分析 3.方案设计 3.1设计依据 3.2设计原则 3.3架构设计 3.3产品设计 3.5服务设计 4.方案收益 5.项目预算 附录A&#xff08;案例&#xff09; 附录B&#xff08;公司资质人员资质等&#xff09; 1.概…

UnrealEngine学习(02):虚幻引擎编辑器界面详解

学习一款软件&#xff0c;我个人建议是先学习怎么用&#xff0c;然后是学习怎么用的好&#xff0c;再研究源码。 上一篇文章详细描述了我们该如何安装虚幻5引擎&#xff1a; UnrealEngine学习(01)&#xff1a;安装虚幻引擎https://blog.csdn.net/zuodingquan666/article/deta…

无人机+消防车:高楼灭火系统技术详解

“无人机消防车”高楼灭火系统技术是一种创新的消防解决方案&#xff0c;旨在解决高层建筑灭火难题。以下是对该技术的详细解析&#xff1a; 一、技术背景与需求 高层建筑数量多&#xff0c;火灾隐患多发。根据国家消防救援局发布的数据&#xff0c;高层建筑火灾频发&#xf…

Robot Operating System——兴趣区域信息

大纲 应用场景定义字段解释 案例 sensor_msgs::msg::RegionOfInterest 是 ROS (Robot Operating System) 中的一个消息类型&#xff0c;用于表示图像中的感兴趣区域 (Region of Interest, ROI)。它通常与图像处理和计算机视觉任务相关联&#xff0c;帮助系统聚焦于图像中的特定…

Java并发编程的核心概念--线程与进程

‌原子性‌&#xff1a;‌操作或多个操作要么全部执行且不被打断&#xff0c;‌要么都不执行。‌这保证了线程在执行操作时不会被其他线程干扰。‌‌可见性‌&#xff1a;‌当多个线程访问同一个变量时&#xff0c;‌一个线程修改了这个变量的值&#xff0c;‌其他线程能够立即…

【MySQL】MySQL表的增删改查(初阶)

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 表内容操作 插入内容 按顺序插入 指定某些列插入 一次插入多行记录 插入时间 查询表内容 全列查询 指定列查询 指定表达式查询 用as取别名 ​编辑 去重查询 排序查询…

计算机毕业设计选题推荐-高校学术交流平台-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

基于微信小程序的行李寄存管理系统的设计与实现(论文+源码)_kaic

基于微信小程序的行李寄存管理系统的设计与实现(论文源码)_kaic 摘 要 人们外出旅行的时候&#xff0c;经常会需要到行李寄存的服务。行李寄存处在全国各地都很常见。现存的行李寄存方式很传统&#xff0c;适合小规模的行李寄存&#xff0c;当行李数量较多时&#xff0c;就…

JVM常见面试题总结

文章目录 1 JVM 组成1.1 JVM架构组成&#x1f525;1.2 JVM 内存结构/内存模型&#x1f525;1.3 堆和栈区别&#x1f525;1.4 详细的介绍 Java 堆&#x1f525;1.5 JVM 为什么使用元空间替换了永久代&#xff1f;&#x1f525;1.6 内存溢出与内存泄漏的区别&#x1f525;1.7 OOM…

根据数据库设计开发一套通用的电子商务平台

目录 案例 【题目】 【问题 1】(9 分) 【问题 2】(9 分) 【问题 3】(7 分) 【答案】 【问题 1】解析 【问题 2】解析 【问题 3】解析 相关推荐 案例 阅读以下关于数据库设计的叙述&#xff0c;在答题纸上回答问题 1 至问题 3。 【题目】 某制造企业为拓展网上销售业…

河南萌新联赛2024第(六)场:郑州大学(补题ABCDFGIL)

文章目录 河南萌新联赛2024第&#xff08;六&#xff09;场&#xff1a;郑州大学A 装备二选一&#xff08;一&#xff09;简单介绍&#xff1a;思路&#xff1a;代码&#xff1a; B 百变吗喽简单介绍&#xff1a;思路&#xff1a;代码&#xff1a; C 16进制世界简单介绍&#x…