Qt使用usbcan通信

news2024/9/23 9:21:05

一.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 通道索引2


MainWindow::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通道1
      if (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通道2
      if (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;// 填写第一帧的ID
        vco.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.coloradmin.cn/o/2068475.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

位运算,CF 878A - Short Program

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 878A - Short Program 二、解题报告 1、思路分析 顺序处理每个操作&…

数据结构(双向链表)代码详细注释

双向链表 1》双向链表的定义 双向链表也叫双链表&#xff0c;与单向链表不同的是&#xff0c;每一个节点有三个区域组成&#xff1a;两个指针域&#xff0c;一个数据域。 前指针域&#xff1a;存储前驱节点的内存地址 后指针域&#xff1a;存储后继节点的内存地址 数据域&…

Oracle归档日志满了,导致程序打不开,如何解决。

加油&#xff0c;新时代打工人&#xff01; 归档日志错误&#xff0c;登录不上&#xff0c;只能用system 角色登录&#xff0c; 错误提示 oracle 错误257 archiver error connect internal only until freed 解决cmd进入rman RMAN&#xff08;Recovery Manager&#xff09;是一…

喜报 | 麒麟信安“信创云桌面解决方案”在浙江省委党校应用实施,荣膺国家级示范案例

近日&#xff0c;国家工信部网络安全产业发展中心公布了2023年信息技术应用创新解决方案入围获奖名单&#xff0c;麒麟信安“信创云桌面解决方案”在浙江省委党校成功应用实施&#xff0c;获评国家工信部2023年信息技术应用创新解决方案党务政务领域应用示范案例。 据悉&#…

Python、R用RFM模型、机器学习对在线教育用户行为可视化分析|附数据、代码

全文链接&#xff1a;https://tecdat.cn/?p37409 分析师&#xff1a;Chunni Wu 随着互联网的不断发展&#xff0c;各领域公司都在拓展互联网获客渠道&#xff0c;为新型互联网产品吸引新鲜活跃用户&#xff0c;刺激用户提高购买力&#xff0c;从而进一步促进企业提升综合实力和…

Linux--进程管理和性能相关工具

文章目录 进程状态进程的基本状态其他更多态运行(Running或R)可中断睡眠(Interruptible Sleep 或 S)不可中断睡眠(Uninterruptible Sleep 或 D)停止(Stopped 或 T)僵尸(Zombie 或 Z) 状态转换 进程管理相关工具进程树pstreepstree -ppstree -T 进程信息psps输出属性查看进程的父…

C语言-从键盘输入一个字符串,将其中的小写字母全部转换成大写字母,然后输出到一个磁盘文件test中保存,输人的字符串以“!”结束

题目要求&#xff1a; 从键盘输入一个字符串,将其中的小写字母全部转换成大写字母,然后输出到一个磁盘文件test中保存,输人的字符串以"!”结束 1.实现程序&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() {FILE* fp fopen("…

新160个crackme - 038-Eternal Bliss.3

运行分析 需要输入注册码 PE分析 VB程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 使用VB Decompiler静态分析&#xff0c;找到关键函数入口点402AC4 ida跳转至402AC4&#xff0c;按F5反汇编&#xff0c;发现有407行代码&#xff0c;配合VB Decompiler得到的代码…

力扣面试经典算法150题:跳跃游戏 II

跳跃游戏 II 今天的题目是力扣面试经典150题中的数组的中等难度题&#xff1a;跳跃游戏II。 题目链接&#xff1a;https://leetcode.cn/problems/jump-game-ii/description/?envTypestudy-plan-v2&envIdtop-interview-150 题目描述 给定一个非负整数数组 nums&#xff0…

springboot框架中filter过滤器的urlPatterns的匹配源码

如下图所示&#xff0c;我使用WebFilter注解的方式定义了一个过滤器&#xff0c;同时定义了过滤器的过滤条件 urlPatterns为/*,可能很多人都知道filter的/*代表所有URL都匹配&#xff0c;但是源码在哪里呢 先打断点看一下调用链 然后跟着调用链慢慢点&#xff0c;看看哪里开始…

redis面试(二十)读写锁WriteLock

写锁WriteLock 和读锁一样&#xff0c;在这个地方执行自己的lua脚本&#xff0c;我们去看一下 和read没有多大的区别 KEYS[1] anyLock ARGV[1] 30000 ARGV[2] UUID_01:threadId_01:write hget anyLock mode&#xff0c;此时肯定是没有的&#xff0c;因为根本没这个锁 …

LangGPT结构化提示词编写实践 #书生大模型实战营#

1.闯关任务&#xff1a; 背景问题&#xff1a;近期相关研究发现&#xff0c;LLM在对比浮点数字时表现不佳&#xff0c;经验证&#xff0c;internlm2-chat-1.8b (internlm2-chat-7b)也存在这一问题&#xff0c;例如认为13.8<13.11。 任务要求&#xff1a;利用LangGPT优化提示…

电脑如何恢复删除的照片?4种实用恢复办法

在日常生活中&#xff0c;我们经常会因为各种原因误删电脑中的照片&#xff0c;而这些照片往往承载着珍贵的回忆。那么&#xff0c;如果不小心删除了照片&#xff0c;我们该如何恢复呢&#xff1f;下面就为大家介绍几种实用的恢复方法。 一、使用回收站恢复 当我们在电脑上删…

【C++】单例模式的解析与应用

C单例模式&#xff1a;深入解析与实战应用 一、单例模式的基本概念二、C中单例模式的实现方式2.1 懒汉式&#xff08;线程不安全&#xff09;2.2 懒汉式&#xff08;线程安全&#xff09;2.3 饿汉式2.4 静态内部类&#xff08;C11及以后&#xff09; 三、单例模式的优缺点四、实…

基于Transformer进行乳腺癌组织病理学图像分类的方法比较

为了提高视觉变压器的精度和泛化能力,近年来出现了基于Poolingbased Vision Transformer (PiT)、卷积视觉变压器(CvT)、CrossFormer、CrossViT、NesT、MaxViT和分离式视觉变压器(SepViT)等新模型。 它们被用于BreakHis和IDC数据集上的图像分类,用于数字乳腺癌组织病理学。在B…

【机器学习】4. 相似性比较(二值化数据)与相关度(correlation)

SMC Simple Matching Coefficient 评估两组二进制数组相似性的参数 SMC (f11 f00) / (f01f10f11f00) 其中&#xff0c;f11表示两组都为1的组合个数&#xff0c;f10表示第一组为1&#xff0c;第二组为0的组合个数。 这样做会有一个缺点&#xff0c;假设是比较稀疏的数据&…

readpaper在读论文时候的默认规定

红色代表主旨思想 蓝色代表专业名词解析

如何为你的SEO策略找到竞争对手的关键词

你有没有想过你的竞争对手是如何总是设法保持领先一步的&#xff1f;或者他们似乎如何扼杀了您所在行业的大部分搜索流量&#xff1f;他们成功的秘诀可能比你想象的要简单——关键词。 在本文中&#xff0c;我们将解释如何使用 SE Ranking、Google Keyword Planner 和 Bing Ke…

Qt坐标系统之三个坐标系和两个变换

前言 Qt坐标系统由QPainter类控制。它和QPaintDevice和QPaintEngine类一起构成Qt绘图系统的基础。QPainter用于执行绘图操作&#xff0c;QPaintDevice是QPainter用来绘制的一个二维空间的抽象&#xff0c;QPaintEngine提供在不同设备绘图的接口。 Qt 的坐标分为逻辑坐标和物理…

深度学习-局部最小值与鞍点【Datawhale X 李宏毅苹果书 AI夏令营】

在网络优化时&#xff0c;有时会出现随时参数不断更新&#xff0c;训练的损失可能不会再下降&#xff0c;但训练结果并不满意。为什么会出现这样的情况呢&#xff1f; 假设排除数据集优劣的问题&#xff0c;可能需要进一步考虑的是为什么网络不再有新的最优值了&#xff0c;在…