当前位置: 首页 > news >正文

USBCAN-II/II+使用方法以及qt操作介绍

一.USBCAN-II/II+介绍

USBCAN-II/II+ 是一款常用的 USB-CAN 转换器,广泛应用于汽车电子、工业自动化等领域。以下是使用该设备的一般步骤和方法:

1. 硬件连接

连接设备:将 USBCAN-II/II+ 的 USB 接口连接到计算机的 USB 端口。
连接 CAN 网络:将 CAN 端口连接到 CAN 总线,确保接线正确,避免极性接反。
在这里插入图片描述

2. 安装驱动程序

下载驱动:访问设备制造商的网站,下载适用于操作系统的驱动程序。
安装驱动:按照安装向导的指示完成驱动程序的安装。
下载地址:https://www.zlg.cn/can/down/down/id/255.html
在这里插入图片描述

3. 配置软件

选择软件:可以使用设备附带的软件,或者使用其他支持 CAN 协议的工具(如 CanTest、CANalyzer、PCAN-View 等)。
设置参数:在软件中配置 CAN 通信参数,如波特率、数据格式等。

  • 这里以CanTest举例
    在这里插入图片描述

4. 进行数据通信

发送数据:使用软件界面发送 CAN 消息,通常需要输入消息 ID 和数据内容。
接收数据:监控接收到的 CAN 消息,软件界面通常会显示接收到的所有数据。

5. 故障排查

检查连接:确保所有连接正确,CAN 总线的终端电阻是否安装。
查看日志:软件通常提供日志功能,可以帮助分析通信问题。

6. 断开连接

安全断开:在完成测试后,确保安全断开 USB 和 CAN 连接,避免数据丢失或设备损坏。
注意事项
电源要求:确保 CAN 网络供电正常。
波特率一致性:确保所有连接的设备波特率一致。
软件兼容性:选择与 USBCAN-II/II+ 兼容的软件工具。

二.Qt操作USBCAN-II/II+

在使用 Qt 操作 USBCAN-II/II+ 设备时,通常需要通过相关的库进行 CAN 通信。以下是一个简单的示例,展示如何在 Qt 中使用 USBCAN-II/II+ 进行基本的 CAN 消息发送和接收。

1. zlgcan 环境准备

确保你已经安装了 Qt 和相应的 USBCAN-II/II+ 驱动程序。你可能还需要下载相关的 SDK 或库文件。(在上面的网址进行下载)
在这里插入图片描述

  • 我这里以配置zlgcan_x64为例。
  1. 将 .h和 lib文件都放到pro工程目录下
    在这里插入图片描述
    在这里插入图片描述

  2. 将kerneldlls文件夹和dll 文件放在debug下的exe目录下
    在这里插入图片描述

  3. 在下面中将.h文件都添加到现有的项目中
    在这里插入图片描述

  4. 添加外部库(添加lib路径)

将为debug版本添加‘d’ 作为后缀取消
在这里插入图片描述

2. zlgcan调试与测试

 // 打开 CAN 设备DEVICE_HANDLE dhandle = ZCAN_OpenDevice(DEVICE_TYPE, 0, 0);if (INVALID_DEVICE_HANDLE == dhandle){std::cout << "打开设备失败" << std::endl;return;}else{std::cout << "打开设备成功" << std::endl;}// 设置波特率if (ZCAN_SetValue(dhandle, "0/baud_rate", "500") != STATUS_OK) {std::cout << "设置波特率失败" << std::endl;ZCAN_CloseDevice(dhandle);return;}else{std::cout << "设置波特率成功" << std::endl;}// 初始化 CAN 通道ZCAN_CHANNEL_INIT_CONFIG cfg;memset(&cfg, 0, sizeof(cfg));cfg.can_type = TYPE_CANFD;cfg.can.filter = 0;cfg.can.mode = 0; // 正常模式cfg.can.acc_code = 0;cfg.can.acc_mask = 0xffffffff;CHANNEL_HANDLE chHandle = ZCAN_InitCAN(dhandle, CHANNEL_INDEX, &cfg);if (INVALID_CHANNEL_HANDLE == chHandle) {std::cout << "初始化通道失败" << std::endl;ZCAN_CloseDevice(dhandle);return;}else{std::cout << "初始化通道成功" << std::endl;}// 启动 CAN 通道if (ZCAN_StartCAN(chHandle) != STATUS_OK) {std::cout << "启动通道失败" << std::endl;ZCAN_CloseDevice(dhandle);return;}else{std::cout << "启动通道成功" << std::endl;}// 准备要发送的 CAN 帧ZCAN_Transmit_Data frame;memset(&frame, 0, sizeof(frame));frame.frame.can_id = 0x00000000; // 设置帧 IDframe.frame.can_dlc = 8; // 设置数据长度BYTE data[] = {1, 2, 3, 4, 5, 6, 7, 8}; // 数据memcpy(frame.frame.data, data, sizeof(data));// 发送数据UINT ret = ZCAN_Transmit(chHandle, &frame, 1);if (ret != 1){std::cout << "发送数据失败" << std::endl;} else{std::cout << "发送数据成功, 数据: ";for (int i = 0; i < frame.frame.can_dlc; ++i){std::cout << (int)frame.frame.data[i] << " ";}std::cout << std::endl;}// 等待接收数据std::this_thread::sleep_for(std::chrono::seconds(1)); // 等待一秒以便接收数据// 接收数据ZCAN_Receive_Data recvFrame;if (ZCAN_Receive(chHandle, &recvFrame, 1) > 0){std::cout << "接收到数据, ID: " << std::hex << recvFrame.frame.can_id << ", 数据: ";for (int i = 0; i < recvFrame.frame.can_dlc; ++i){std::cout << (int)recvFrame.frame.data[i] << " ";}std::cout << std::dec << std::endl; // 恢复到十进制输出} else{std::cout << "未接收到数据" << std::endl;}// 关闭通道和设备ZCAN_CloseDevice(dhandle);

3. ControlCAN 环境准备

  1. 选择具体要配置的编译器
    在这里插入图片描述
    在这里插入图片描述

2. lib 和 .h 文件放在pro目录下,kerneldlls文件夹和dll文件放在debug目录下的exe文件中
3. 引入外部库

3. 自发自收模式

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include"ControlCAN.h"
#include<QDebug>
#include <windows.h>
#include<stdio.h>#define DEVICE_TYPE 4    // 设备类型
#define DEVICE_INDEX 0   // 设备索引
#define CAN_INDEX 0      // CAN 通道索引MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 初始化CAN设备//VCI_OpenDevice(DWORD DeviceType,DWORD DeviceInd,DWORD Reserved)if (VCI_OpenDevice(DEVICE_TYPE, DEVICE_INDEX, 0) == 0){qDebug()<<"打开设备失败!";return ;}else{qDebug()<<"打开设备成功!";}// 初始化配置结构VCI_INIT_CONFIG initConfig;initConfig.AccCode = 0x00000000;  // 接收过滤器initConfig.AccMask = 0xFFFFFFFF;   // 接收掩码initConfig.Filter = 0;              // 过滤器类型initConfig.Timing0 = 0x00;          // 时间参数initConfig.Timing1 = 0x14;          // 时间参数initConfig.Mode = 0;                 // 工作模式//initConfig.BaudRate = BAUDRATE;      // 波特率// 设置CAN通道//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()<<"初始化CAN通道失败!";return ;}else{qDebug()<<"初始化CAN通道成功!";}// 启动CAN通道if (VCI_StartCAN(DEVICE_TYPE, DEVICE_INDEX, CAN_INDEX) == 0) {//printf("启动CAN通道失败!\n");qDebug()<<"启动CAN通道失败!";return ;}else{qDebug()<<"启动CAN通道成功!";}VCI_CAN_OBJ vco[2];// 定义两帧的结构体数组// 中间略去其他函数代码vco[0].ID = 0x00000001;// 填写第一帧的IDvco[0].SendType = 2;// 自发自收模式vco[0].RemoteFlag = 0;// 数据帧vco[0].ExternFlag = 0;// 标准帧vco[0].DataLen = 1;// 数据长度1个字节vco[0].Data[0] = 0x66;// 数据0为0x66,十进制102vco[1].ID = 0x00000002;// 填写第二帧的IDvco[1].SendType = 2;// 自发自收模式vco[1].RemoteFlag = 0;// 数据帧vco[1].ExternFlag = 0;// 标准帧vco[1].DataLen = 1;// 数据长度1个字节vco[1].Data[0] = 0x55;// 数据0为0x55,十进制85DWORD dwRel = VCI_Transmit(DEVICE_TYPE, DEVICE_INDEX, CAN_INDEX, vco, 2); // 发送两帧if(dwRel){qDebug()<<"nCANInd 1 transmit successful,dwRel="<<dwRel;}else{qDebug()<<"nCANInd 1 transmit fail";}VCI_CAN_OBJ receive_obj[100]; // 接收缓冲区// 循环接收数据int count=5;while (count) {DWORD receive_count = VCI_Receive(DEVICE_TYPE, DEVICE_INDEX, CAN_INDEX, receive_obj, 100, 400); // 400ms超时if (receive_count > 0) {for (DWORD i = 0; i < receive_count; i++) {for (int j = 0; j < receive_obj[i].DataLen; j++) {qDebug()<<"接受到的数据如下:"<<receive_obj[i].Data[j];}}} else {qDebug()<<"没有接收到数据。";}Sleep(100); // 睡眠100毫秒,避免过于频繁的轮询count--;}// 关闭设备if(VCI_CloseDevice(DEVICE_TYPE, DEVICE_INDEX)){qDebug()<<"设备关闭成功";}else{qDebug()<<"设备关闭失败";}}

在这里插入图片描述

相关文章:

USBCAN-II/II+使用方法以及qt操作介绍

一.USBCAN-II/II介绍 USBCAN-II/II 是一款常用的 USB-CAN 转换器&#xff0c;广泛应用于汽车电子、工业自动化等领域。以下是使用该设备的一般步骤和方法&#xff1a; 1. 硬件连接 连接设备&#xff1a;将 USBCAN-II/II 的 USB 接口连接到计算机的 USB 端口。 连接 CAN 网络…...

笔记-系统规划与管理师-案例题-2022年-IT服务部署实施

【说明】 某大型企业去年信息化投入大&#xff0c;完成了重点核心业务系统的建设。由于应急相应预案制定得不充分并且未开展演练&#xff0c;出现了系统性故障时&#xff0c;部分关键的应用系统不可用且在12小时内未能完成恢复业务&#xff0c;给企业带来了较大损失。 为加强该…...

Kubernetes 清理资源常用的 Kubernetes 清理命

清理特定状态的 Pod&#xff1a; 清理 Evicted 状态的 Pod&#xff1a; kubectl get pods --all-namespaces -o wide | grep Evicted | awk {print $1,$2} | xargs -L1 kubectl delete pod -n清理 Error 状态的 Pod&#xff1a; kubectl get pods --all-namespaces -o wide | g…...

【数据结构初阶】二叉树--基本概念

hello&#xff01; 目录 一、树 1.1 树的概念和结构 1.2 树的相关术语 1.3 树的表示 1.4 树形结构实际应用场景 二、二叉树 2.1 概念和结构 2.2 特殊的二叉树 2.2.1 满二叉树 2.2.2 完全二叉树 2.3 二叉树的存储结构 2.3.1 顺序结构 2.3.2 链式结构 …...

Pytorch添加自定义算子之(12)-开闭原则设计tensorrt和onnxruntime推理语义分割模型

一、开闭原则 开闭原则是SOLID原则中的一个,指的是尽量使用开放扩展,关闭修改的设计原则。 在C++中如何使用开闭原则导出动态库,可以按照以下步骤进行: 定义抽象基类:定义动态库中的抽象基类,该基类应该封装可扩展的接口。 实现派生类:实现基类的派生类,这些派生类将封…...

第二百零九节 Java格式 - Java数字格式类

Java格式 - Java数字格式类 以下两个类可用于格式化和解析数字: java.text.NumberFormatjava.text.DecimalFormat NumberFormat 类可以格式化一个数字特定地区的预定义格式。 DecimalFormat 类可以格式化数字以特定区域设置的自定义格式。 NumberFormat类的 getXXXInstance…...

LSI-9361阵列卡笔记

背景 要将raid0更改为JBOD直通模式 注意的点是要先将raid模式调整为JBOD之后重启机器&#xff0c;即可 备注&#xff1a;转换过程中硬盘中的数据未丢失。 步骤贴图 refer https://zhiliao.h3c.com/questions/dispcont/123250 https://blog.csdn.net/GreapFruit_J/article/…...

ArcGIS热点分析 (Getis-Ord Gi*)——基于地级市尺度的七普人口普查数据的热点与冷点分析

先了解什么是热点分析 ? 热点分析 (Getis-Ord Gi*) 是一种用于空间数据分析的技术&#xff0c;主要用于识别地理空间数据中值的聚集模式&#xff0c;可以帮助我们理解哪些区域存在高值或低值的聚集&#xff0c;这些聚集通常被称为“热点”或“冷点”&#xff0c;Gi* 统计量为…...

ASIACRYPT 2021

分类文章编号获奖论文1-3后量子密码4-9多方计算10-15物理攻击,泄露和对策16-21理论22-27公钥密码和鉴权密钥交换28-33高级加密和签名34-39对称密钥构建40-46量子安全47-53获奖论文54对称密码分析55-66增强型公钥加密和时间锁难题67-72同态加密和加密搜索73-77NIZK和SNARK78-80…...

C#学习之路day1

目录 一、概念&#xff1a;.net和c# 二、.net发展方向 三、.Net两种交互模式 四、创建项目 五、vs的组成部分 六、我的第一个C#程序 七、多个项目时启动项目的设置 八、注释 九、快捷键 一、概念&#xff1a;.net和c# 1、.net/dotnet :一般指.Net Framework框架&#…...

【安当产品应用案例100集】010-基于国密UKEY的信封加密应用案例

安当有个客户开发了一套C/S架构的软件&#xff0c;Server在云端&#xff0c;Client由不同的用户使用。最初软件设计开发的时候&#xff0c;没有考虑数据安全形势日渐严峻的问题&#xff0c;Server端和Client端直接就建立一个socket连接来进行通信&#xff0c;Server端发出去的数…...

扫码点餐系统小程序功能分析

扫码点餐系统小程序通常具备以下核心功能&#xff1a; 用户界面&#xff1a;提供直观易用的界面&#xff0c;方便用户浏览菜单、选择菜品、查看订单状态等 。菜单展示&#xff1a;展示餐厅的菜单&#xff0c;包括菜品图片、价格、描述等信息 。扫码点餐&#xff1a;用户通过…...

网络安全——基础知识记忆梳理

1. SQL注入攻击 SQL注入攻击是一种常见的网络安全威胁&#xff0c;它利用Web应用程序中对用户输入的数据的不正确处理&#xff0c;攻击者可以在SQL查询中注入恶意代码&#xff0c;从而执行非授权的数据库操作。这种攻击方式可以导致数据泄漏、数据篡改、绕过认证等多种安全问题…...

GitHub开源的轻量级文件服务器,可docker一键部署

文件服务器 介绍安装使用命令使用API调用 介绍 项目github官网地址 Dufs是一款由Rust编写的轻量级文件服务器&#xff0c;不仅支持静态文件服务&#xff0c;还能轻松上传、下载、搜索文件&#xff0c;甚至支持WebDAV&#xff0c;让我们通过Web方式远程管理文件变得轻而易举。…...

Scratch编程深度探索:解锁递归与分治算法的奥秘

标题&#xff1a;Scratch编程深度探索&#xff1a;解锁递归与分治算法的奥秘 在编程的世界里&#xff0c;递归和分治算法以其精妙的逻辑结构和解决问题的能力而著称。Scratch&#xff0c;这款专为儿童和初学者设计的图形化编程工具&#xff0c;是否能够支持实现这样复杂的逻辑…...

使用docker compose一键部署 Portainer

使用docker compose一键部署 Portainer Portainer 是一款轻量级的应用&#xff0c;它提供了图形化界面&#xff0c;用于方便地管理Docker环境&#xff0c;包括单机环境和集群环境。 1、创建安装目录 mkdir /data/partainer/ -p && cd /data/partainer2、创建docker…...

js原生模板引擎

在JavaScript中,可以使用模板字符串(template strings)来创建简单的模板。模板字符串是用反引号(`)标识的字符串,其中内嵌表达式使用${}格式。 下面是一个简单的模板函数示例,它接受一个对象作为参数,并使用模板字符串来生成一个HTML字符串。 function createTemplat…...

Java面试题———MySql篇③

目录 1.查询语句执行流程 2.索引的数据结构是什么 3.数据库中的锁有哪些 4.MySQL日志类型 5.MySQL主从复制的流程 6.谈谈你对sql的优化的经验 1.查询语句执行流程 一条查询语句到达MySQL数据库之后&#xff0c;数据库中的各个组件会按照顺序执行自己的任务 首先是连接器…...

ArcGis在线地图插件Maponline(好用版)

ArcGis加载插件&#xff0c;可在线浏览谷歌地图、天地图、高德地图、必应地图等多种&#xff0c;包含街道、影像、标注地图等信息&#xff08;谷歌地图需自备上网手段&#xff09;&#xff0c;免费注册账号即可使用&#xff0c;可加载无水印底图。 与大地2000坐标无需配准直接使…...

Chainlit接入DifyAI知识库接口快速实现自定义用户聊天界面

前言 由于dify只提供了一个分享用的网页应用&#xff0c;网页访问地址没法自定义&#xff0c;虽然可以接入NextWeb/ChatGPT web/open webui等开源应用。但是如果我们想直接给客户应用&#xff0c;还需要客户去设置配置&#xff0c;里面还有很多我们不想展示给客户的东西怎么办…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

加密通信 + 行为分析:运营商行业安全防御体系重构

在数字经济蓬勃发展的时代&#xff0c;运营商作为信息通信网络的核心枢纽&#xff0c;承载着海量用户数据与关键业务传输&#xff0c;其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级&#xff0c;传统安全防护体系逐渐暴露出局限性&a…...

Qwen系列之Qwen3解读:最强开源模型的细节拆解

文章目录 1.1分钟快览2.模型架构2.1.Dense模型2.2.MoE模型 3.预训练阶段3.1.数据3.2.训练3.3.评估 4.后训练阶段S1: 长链思维冷启动S2: 推理强化学习S3: 思考模式融合S4: 通用强化学习 5.全家桶中的小模型训练评估评估数据集评估细节评估效果弱智评估和民间Arena 分析展望 如果…...