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为例。
-
将 .h和 lib文件都放到pro工程目录下


-
将kerneldlls文件夹和dll 文件放在debug下的exe目录下

-
在下面中将.h文件都添加到现有的项目中

-
添加外部库(添加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 环境准备
- 选择具体要配置的编译器


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 转换器,广泛应用于汽车电子、工业自动化等领域。以下是使用该设备的一般步骤和方法: 1. 硬件连接 连接设备:将 USBCAN-II/II 的 USB 接口连接到计算机的 USB 端口。 连接 CAN 网络…...
笔记-系统规划与管理师-案例题-2022年-IT服务部署实施
【说明】 某大型企业去年信息化投入大,完成了重点核心业务系统的建设。由于应急相应预案制定得不充分并且未开展演练,出现了系统性故障时,部分关键的应用系统不可用且在12小时内未能完成恢复业务,给企业带来了较大损失。 为加强该…...
Kubernetes 清理资源常用的 Kubernetes 清理命
清理特定状态的 Pod: 清理 Evicted 状态的 Pod: kubectl get pods --all-namespaces -o wide | grep Evicted | awk {print $1,$2} | xargs -L1 kubectl delete pod -n清理 Error 状态的 Pod: kubectl get pods --all-namespaces -o wide | g…...
【数据结构初阶】二叉树--基本概念
hello! 目录 一、树 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之后重启机器,即可 备注:转换过程中硬盘中的数据未丢失。 步骤贴图 refer https://zhiliao.h3c.com/questions/dispcont/123250 https://blog.csdn.net/GreapFruit_J/article/…...
ArcGIS热点分析 (Getis-Ord Gi*)——基于地级市尺度的七普人口普查数据的热点与冷点分析
先了解什么是热点分析 ? 热点分析 (Getis-Ord Gi*) 是一种用于空间数据分析的技术,主要用于识别地理空间数据中值的聚集模式,可以帮助我们理解哪些区域存在高值或低值的聚集,这些聚集通常被称为“热点”或“冷点”,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
目录 一、概念:.net和c# 二、.net发展方向 三、.Net两种交互模式 四、创建项目 五、vs的组成部分 六、我的第一个C#程序 七、多个项目时启动项目的设置 八、注释 九、快捷键 一、概念:.net和c# 1、.net/dotnet :一般指.Net Framework框架&#…...
【安当产品应用案例100集】010-基于国密UKEY的信封加密应用案例
安当有个客户开发了一套C/S架构的软件,Server在云端,Client由不同的用户使用。最初软件设计开发的时候,没有考虑数据安全形势日渐严峻的问题,Server端和Client端直接就建立一个socket连接来进行通信,Server端发出去的数…...
扫码点餐系统小程序功能分析
扫码点餐系统小程序通常具备以下核心功能: 用户界面:提供直观易用的界面,方便用户浏览菜单、选择菜品、查看订单状态等 。菜单展示:展示餐厅的菜单,包括菜品图片、价格、描述等信息 。扫码点餐:用户通过…...
网络安全——基础知识记忆梳理
1. SQL注入攻击 SQL注入攻击是一种常见的网络安全威胁,它利用Web应用程序中对用户输入的数据的不正确处理,攻击者可以在SQL查询中注入恶意代码,从而执行非授权的数据库操作。这种攻击方式可以导致数据泄漏、数据篡改、绕过认证等多种安全问题…...
GitHub开源的轻量级文件服务器,可docker一键部署
文件服务器 介绍安装使用命令使用API调用 介绍 项目github官网地址 Dufs是一款由Rust编写的轻量级文件服务器,不仅支持静态文件服务,还能轻松上传、下载、搜索文件,甚至支持WebDAV,让我们通过Web方式远程管理文件变得轻而易举。…...
Scratch编程深度探索:解锁递归与分治算法的奥秘
标题:Scratch编程深度探索:解锁递归与分治算法的奥秘 在编程的世界里,递归和分治算法以其精妙的逻辑结构和解决问题的能力而著称。Scratch,这款专为儿童和初学者设计的图形化编程工具,是否能够支持实现这样复杂的逻辑…...
使用docker compose一键部署 Portainer
使用docker compose一键部署 Portainer Portainer 是一款轻量级的应用,它提供了图形化界面,用于方便地管理Docker环境,包括单机环境和集群环境。 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数据库之后,数据库中的各个组件会按照顺序执行自己的任务 首先是连接器…...
ArcGis在线地图插件Maponline(好用版)
ArcGis加载插件,可在线浏览谷歌地图、天地图、高德地图、必应地图等多种,包含街道、影像、标注地图等信息(谷歌地图需自备上网手段),免费注册账号即可使用,可加载无水印底图。 与大地2000坐标无需配准直接使…...
Chainlit接入DifyAI知识库接口快速实现自定义用户聊天界面
前言 由于dify只提供了一个分享用的网页应用,网页访问地址没法自定义,虽然可以接入NextWeb/ChatGPT web/open webui等开源应用。但是如果我们想直接给客户应用,还需要客户去设置配置,里面还有很多我们不想展示给客户的东西怎么办…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
