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

java调用周立功USBCAN SDK读取汽车总线数据

java调用周立功USBCAN SDK读取汽车总线数据

  • 准备
    • 新的改变
    • 后端
    • 前端

准备

我这测试用的两个usbcan-2e-u盒子,一个发送端一个接收端,两个盒子要通过can口进行串联起来,测试工具用的canTest或者zcanpro,这两个工具在官网上都可以下载。

项目是要做一个汽车端的工控屏(win10)的数据大屏,效果如下:
在这里插入图片描述

新的改变

由于周立功sdk只有c和python的,没有Java的,项目其他业务逻辑都已经用Java写好,所以这里直接参照官网提供的python demo进行改造。

后端

Java项目技术栈是springboot+thymeleaf的,把dll文件放到Java项目的resources目录下。其中zlgcan.dll文件和kerneldlls文件夹是从周立功官网上的pythonDemo里拷贝过来的,目前在 PYTHON型号合集\USBCAN-xE-U系列_。

在这里插入图片描述
maven要引进jni包进行调用dll文件

 		<dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId><version>5.12.1</version></dependency>

后端改造代码

package com.example.car;import com.fasterxml.jackson.databind.ObjectMapper;
import com.sun.jna.*;
import jakarta.annotation.PostConstruct;
import org.springframework.stereotype.Component;import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;@Component
public class ZlgCan {// 设备类型常量public static final int ZCAN_USBCAN_2E_U = 21;public static final int INVALID_DEVICE_HANDLE = 0;// 状态常量public static final int ZCAN_STATUS_OK = 1;public static final int ZCAN_TYPE_CAN = 0;// 设备信息结构体public static class ZCAN_DEVICE_INFO extends Structure {public short hw_Version;public short fw_Version;public short dr_Version;public short in_Version;public short irq_Num;public byte can_Num;public byte[] str_Serial_Num = new byte[20];public byte[] str_hw_Type = new byte[40];public short[] reserved = new short[4];@Overrideprotected List<String> getFieldOrder() {return Arrays.asList("hw_Version", "fw_Version", "dr_Version", "in_Version","irq_Num", "can_Num", "str_Serial_Num", "str_hw_Type", "reserved");}public String getSerial() {return new String(str_Serial_Num).trim();}public String getHwType() {return new String(str_hw_Type).trim();}@Overridepublic String toString() {return String.format("Hardware Version: 0x%04X%nFirmware Version: 0x%04X%n" +"Driver Version: 0x%04X%nInterface Version: 0x%04X%n" +"IRQ Num: %d%nCAN Num: %d%nSerial: %s%nHardware Type: %s%n",hw_Version, fw_Version, dr_Version, in_Version,irq_Num, can_Num, getSerial(), getHwType());}}// CAN帧结构体public static class ZCAN_CAN_FRAME extends Structure {public int flags; // 包含can_id, err, rtr, eff位域public byte can_dlc;public byte __pad;public byte __res0;public byte __res1;public byte[] data = new byte[8];@Overrideprotected List<String> getFieldOrder() {return Arrays.asList("flags", "can_dlc", "__pad", "__res0", "__res1", "data");}public int getCanId() {return flags & 0x1FFFFFFF; // 29位ID}public void setCanId(int id) {flags = (flags & ~0x1FFFFFFF) | (id & 0x1FFFFFFF);}public int getEff() {return (flags >> 31) & 0x1; // 扩展帧标志}public int getRtr() {return (flags >> 30) & 0x1; // 远程帧标志}public int getErr() {return (flags >> 29) & 0x1; // 错误帧标志}}// 传输数据结构体public static class ZCAN_Transmit_Data extends Structure {public ZCAN_CAN_FRAME frame;public int transmit_type;@Overrideprotected List<String> getFieldOrder() {return Arrays.asList("frame", "transmit_type");}}// 接收数据结构体public static class ZCAN_Receive_Data extends Structure {public ZCAN_CAN_FRAME frame;public long timestamp;@Overrideprotected List<String> getFieldOrder() {return Arrays.asList("frame", "timestamp");}}// 通道初始化配置public static class ZCAN_CHANNEL_INIT_CONFIG extends Structure {public int can_type;public CAN_INIT_CONFIG config;@Overrideprotected List<String> getFieldOrder() {return Arrays.asList("can_type", "config");}public static class CAN_INIT_CONFIG extends Union {public CAN_CONFIG can;public CANFD_CONFIG canfd;@Overrideprotected List<String> getFieldOrder() {return Arrays.asList("can", "canfd");}public static class CAN_CONFIG extends Structure {public int acc_code;public int acc_mask;public int reserved;public byte filter;public byte timing0;public byte timing1;public byte mode;@Overrideprotected List<String> getFieldOrder() {return Arrays.asList("acc_code", "acc_mask", "reserved","filter", "timing0", "timing1", "mode");}}public static class CANFD_CONFIG extends Structure {public int acc_code;public int acc_mask;public int abit_timing;public int dbit_timing;public int brp;public byte filter;public byte mode;public short pad;public int reserved;@Overrideprotected List<String> getFieldOrder() {return Arrays.asList("acc_code", "acc_mask", "abit_timing", "dbit_timing","brp", "filter", "mode", "pad", "reserved");}}}}// JNA接口映射public interface ZlgCanLibrary extends Library {ZlgCanLibrary INSTANCE = Native.load("zlgcan", ZlgCanLibrary.class);// 设备操作Pointer ZCAN_OpenDevice(int device_type, int device_index, int reserved);int ZCAN_CloseDevice(Pointer device_handle);int ZCAN_GetDeviceInf(Pointer device_handle, ZCAN_DEVICE_INFO info);int ZCAN_IsDeviceOnLine(Pointer device_handle);// 通道操作Pointer ZCAN_InitCAN(Pointer device_handle, int can_index, ZCAN_CHANNEL_INIT_CONFIG init_config);int ZCAN_StartCAN(Pointer chn_handle);int ZCAN_ResetCAN(Pointer chn_handle);int ZCAN_ClearBuffer(Pointer chn_handle);int ZCAN_GetReceiveNum(Pointer chn_handle, int can_type);// 数据传输int ZCAN_Transmit(Pointer chn_handle, ZCAN_Transmit_Data[] msgs, int len);int ZCAN_Receive(Pointer chn_handle, ZCAN_Receive_Data[] rcv_msgs, int rcv_num, int wait_time);// 配置操作int ZCAN_SetValue(Pointer device_handle, String path, String value);}@PostConstructprivate void getDeviceInfo() {ZlgCanLibrary lib = ZlgCanLibrary.INSTANCE;// 打开设备Pointer deviceHandle = lib.ZCAN_OpenDevice(ZCAN_USBCAN_2E_U, 1, 0);if (Pointer.nativeValue(deviceHandle) == INVALID_DEVICE_HANDLE) {System.err.println("Open USBCAN-XE-U device failed!");System.exit(1);}System.out.println("Open USBCAN-XE-U device success!");System.out.println("Device handle: " + Pointer.nativeValue
http://www.dtcms.com/a/293088.html

相关文章:

  • [3-02-02].第04节:开发应用 - RequestMapping注解的属性2
  • TCP头部
  • Kotlin伴生对象
  • Go后端配置文件教程
  • LeetCode|Day22|231. 2 的幂|Python刷题笔记
  • AI一周事件(2025年7月15日-7月21日)
  • 开发避坑短篇(4):跨域请求中Session数据丢失的排查与修复方案
  • Qt资源系统:如何有效管理图片和文件
  • 【黑马SpringCloud微服务开发与实战】(五)微服务保护
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 访问鉴权功能实现
  • MMDeploy模型转换与TensorRT推理遇到问题及解决方案
  • GRU模型
  • Trae安装指定版本的插件
  • Clickhouse源码分析-副本数据同步
  • 网络编程---TCP协议
  • Spring AI 系列之十九 - Ollama集成Deepseek
  • 配置https ssl证书生成
  • 数字护网:一次深刻的企业安全体系灵魂演练
  • 接口测试用例选择及效能优化策略
  • vcs门级仿真(后仿真)指南
  • 如何处理各行业的DDOS问题?
  • VUE2 学习笔记3 v-on、事件修饰符、键盘事件
  • JAVA后端面试笔记
  • 前端性能优化:从“龟速“到“闪电“的终极加速指南
  • c++day05(ASCII)
  • Git GitHub精通:前端协作开发的“瑞士军刀“!
  • 字符串相关函数
  • visual studio 性能调试
  • 大数据之Hive:Hive中week相关的几个函数
  • 【Java】SVN 版本控制软件的快速安装(可视化)