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. 环境准备

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

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

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

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

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

将为debug版本添加'd' 作为后缀取消

2. 调试与测试

cpp 复制代码
 // 打开 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; // 设置帧 ID
        frame.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);
相关推荐
淡写青春2099 分钟前
计算机基础---进程间通信和线程间通信的方式
java·开发语言·数据结构
《源码好优多》13 分钟前
基于Java Springboot未央商城管理系统
java·开发语言·spring boot
平头哥在等你13 分钟前
python特殊字符序列
开发语言·python·正则表达式
特种加菲猫21 分钟前
初阶数据结构之栈的实现
开发语言·数据结构·笔记
江-小北22 分钟前
Java基础面试题04:Iterator 和 ListIterator 的区别是什么?
java·开发语言
鸽鸽程序猿37 分钟前
【前端】javaScript
开发语言·前端·javascript
kylin王国44 分钟前
R语言p值矫正整的方法
开发语言·r语言·p值
凯子坚持 c1 小时前
C++之二叉搜索树:高效与美的极致平衡
开发语言·c++
菜鸟起航ing1 小时前
Java中日志采集框架-JUL、Slf4j、Log4j、Logstash
java·开发语言·log4j·logback
凤枭香1 小时前
Python Scikit-learn简介(二)
开发语言·python·机器学习·scikit-learn