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

周立功、致远电子usbcan2代码开发配置过程

梳理基于致远电子USBCAN2的项目创建、环境配置,以及模拟D520发送CAN报文的代码编写步骤。

ZLGCAN二次开发说明/函数库/例程下载 连接:

https://manual.zlg.cn/web/#/152?page_id=5332

你现在需要按照「文件类型分类存放」的原则,将ZLG致远电子的开发文件放入对应目录,既要让Visual Studio编译器能找到头文件/库文件,又要让程序运行时能调用动态库文件,下面结合你的项目结构给出精准操作步骤:

创建 控制台应用C++ 项目

第一步:先整理ZLG开发文件(先分类,避免混乱)

先把你下载的ZLG开发资料中的文件按类型归类,明确核心文件:

文件类型核心文件用途
头文件(.h)zlgcan.h、canframe.h等让编译器识别ZCAN相关函数/结构体
静态库文件(.lib)zlgcan.lib编译时链接CAN库接口
动态库文件(.dll)zlgcan.dll程序运行时调用CAN设备功能
内核依赖文件夹kerneldlls(整个文件夹)支撑zlgcan.dll运行的底层依赖
其他可选文件示例代码、帮助文档等参考使用,无需放入项目目录

第二步:在项目根目录新建SDK文件夹(统一存放头文件+lib文件)

你的项目根目录是:D:\......\ZLG_CAN\ConsoleApplication1

  1. 进入该根目录,新建一个文件夹,命名为ZLG_SDK(名称可自定义,方便识别即可);
  2. 进入ZLG_SDK文件夹,再新建两个子文件夹,分别命名为include(存放头文件.h)和lib(存放静态库.lib);
  3. 将ZLG开发资料中的所有.h文件复制到ZLG_SDK\include目录下;
  4. 将ZLG开发资料中的zlgcan.lib文件复制到ZLG_SDK\lib目录下。


第三步:存放动态库(.dll)和kerneldlls文件夹(关键:放可执行输出目录)

程序运行时需要加载zlgcan.dllkerneldlls文件夹,必须放入项目编译后的可执行文件输出目录,你的项目有两个x64\Debug目录,优先放入「外层核心输出目录」,操作如下:

方案1:优先放入外层x64\Debug(推荐,VS默认输出目录)

直接将以下文件/文件夹复制到:D:\AppFile\铲运机代码资料\CAN\ZLG_CAN\ConsoleApplication1\x64\Debug

  • zlgcan.dll(动态库文件)
  • kerneldlls(整个文件夹,包含其内部所有文件,不要拆分)

方案2:额外备份到内层x64\Debug(保险起见,避免路径不匹配)

再将上述zlgcan.dllkerneldlls文件夹,复制到内层目录:D:\AppFile\铲运机代码资料\CAN\ZLG_CAN\ConsoleApplication1\ConsoleApplication1\x64\Debug

说明:VS项目的输出目录可能因配置不同,指向外层或内层x64\Debug,两个目录都放入可避免“缺少dll文件”的运行错误。

第四步:验证文件存放结构(确保无误)

存放完成后,你的项目目录结构应如下(关键节点标注):

D:. ├─ConsoleApplication1 (项目子目录) │ └─x64 │ └─Debug (内层可执行目录,已放zlgcan.dll + kerneldlls) ├─ZLG_SDK (新建的SDK文件夹,存放头文件和lib) │ ├─include (zlgcan.h、canframe.h等) │ └─lib (zlgcan.lib) └─x64 └─Debug (外层可执行目录,已放zlgcan.dll + kerneldlls,核心输出目录)

第五步:衔接之前的项目属性配置(关键,让VS识别SDK文件)

文件存放完成后,回到Visual Studio中,右键你的项目(ConsoleApplication1)→「属性」,按以下配置(对应你新建的ZLG_SDK路径):

  1. 配置包含目录(让编译器找到.h文件)
    路径:C/C++ → 常规 → 附加包含目录,添加$(ProjectDir)ZLG_SDK\include
    $(ProjectDir)是VS内置变量,自动对应项目根目录,无需手动输入完整路径,更灵活)

  2. 配置库目录(让链接器找到.lib文件)
    路径:链接器 → 常规 → 附加库目录,添加$(ProjectDir)ZLG_SDK\lib

  3. 配置附加依赖项(链接zlgcan.lib)
    路径:链接器 → 输入 → 附加依赖项,添加zlgcan.lib


补充注意事项

  1. 不要随意修改ZLG文件的文件名(如zlgcan.dll改为zlgcan1.dll),否则程序会无法识别;
  2. 若后续切换Release模式(发布版本),需将zlgcan.dllkerneldlls同样复制到x64\Release目录下;
  3. 若运行程序时提示“找不到zlgcan.dll”,说明动态库放错了目录,优先检查外层x64\Debug目录是否存在该文件。

以下为我自己写的测试程序,根据键盘不同按键发送不同报文内容,可按需摘取改动。

#include<stdio.h>#include<windows.h>#include<process.h>#include<string.h>#include<stdarg.h>#defineZLG_CAN_API_ENABLE#defineUSBCAN2_SUPPORT#include"zlgcan.h"#include"canframe.h"#include"typedef.h"#include"config.h"#defineDEVICE_TYPEZCAN_USBCAN2#defineDEVICE_INDEX0#defineCAN_INDEX0CRITICAL_SECTION g_printLock;/* ================= 安全打印 ================= */voidsafe_printf(constchar*fmt,...){EnterCriticalSection(&g_printLock);va_list args;va_start(args,fmt);vprintf(fmt,args);va_end(args);LeaveCriticalSection(&g_printLock);}/* ================= 周期报文 ================= *//* 1BB / 2BB / 3BB / 4BB / 73B */ZCAN_Transmit_Data g_frames[]={/* 0: 1BB 行走/作业 */{{MAKE_CAN_ID(0x1BB,0,0,0),8,0,0,0,{0,0,0,0,0,0,0x01,0x20}},0},/* 1: 2BB 点火/驻车/喇叭 */{{MAKE_CAN_ID(0x2BB,0,0,0),8,0,0,0,{0,0,0,0,0,0,0x04,0x07}},0},/* 2: 3BB */{{MAKE_CAN_ID(0x3BB,0,0,0),2,0,0,0,{0x00,0x0F}},0},/* 3: 4BB */{{MAKE_CAN_ID(0x4BB,0,0,0),7,0,0,0,{0x30,0x8A,0x03,0x00,0xFF,0xFF,0x00}},0},/* 4: 73B 初始化完成 */{{MAKE_CAN_ID(0x73B,0,0,0),1,0,0,0,{0x05}},0}};#defineIDX_1BB0#defineIDX_2BB1constUINT FRAME_COUNT=sizeof(g_frames)/sizeof(g_frames[0]);/* ================= 上电一次 5BB ================= */ZCAN_Transmit_Data g_frame_5BB={{MAKE_CAN_ID(0x5BB,0,0,0),8,0,0,0,{0x60,0x00,0x28,0x01,0x00,0x35,0x00,0x08}},0};/* ================= 1BB 键盘 ================= */voidUpdate1BB(){BYTE*d=g_frames[IDX_1BB].frame.data;memset(d,0,8);d[6]=0x01;d[7]=0x20;/* 刹车 */if(GetAsyncKeyState(VK_SPACE)&0x8000){d[7]=0x21;return;}/* 作业 */if(GetAsyncKeyState('W')&0x8000)d[3]=0x64;if(GetAsyncKeyState('S')&0x8000)d[3]=0x9C;if(GetAsyncKeyState('A')&0x8000)d[4]=0x64;if(GetAsyncKeyState('D')&0x8000)d[4]=0x9C;/* 行走 / 转向 */if(GetAsyncKeyState(VK_LEFT)&0x8000){d[0]=0x9C;d[7]=0x22;}if(GetAsyncKeyState(VK_RIGHT)&0x8000){d[0]=0x64;d[7]=0x22;}if(GetAsyncKeyState(VK_DOWN)&0x8000){d[1]=0x64;d[7]=0x22;}if(GetAsyncKeyState(VK_UP)&0x8000){d[1]=0x9C;d[7]=0x22;}}/* ================= 2BB 键盘 ================= */voidUpdate2BB(){BYTE*d=g_frames[IDX_2BB].frame.data;memset(d,0,8);d[6]=0x04;d[7]=0x07;if(GetAsyncKeyState('F')&0x8000)// 点火{d[2]=0x01;d[3]=0x01;}if(GetAsyncKeyState('P')&0x8000)// 驻车{d[1]=0x08;d[2]=0x01;}if(GetAsyncKeyState('H')&0x8000)// 喇叭{d[2]=0x01;}}/* ================= 接收线程 ================= */unsigned__stdcallCanRxThread(void*param){CHANNEL_HANDLE hCan=(CHANNEL_HANDLE)param;ZCAN_Receive_Data rx[100];safe_printf("[CAN RX] 启动\n");while(1){UINT cnt=ZCAN_Receive(hCan,rx,100,100);for(UINT i=0;i<cnt;i++){safe_printf("[RX] %03X :",rx[i].frame.can_id&0x7FF);for(intj=0;j<rx[i].frame.can_dlc;j++)safe_printf(" %02X",rx[i].frame.data[j]);safe_printf("\n");}}}/* ================= 主函数 ================= */intmain(){DEVICE_HANDLE hDev;CHANNEL_HANDLE hCan;ZCAN_CHANNEL_INIT_CONFIG cfg={0};InitializeCriticalSection(&g_printLock);hDev=ZCAN_OpenDevice(DEVICE_TYPE,DEVICE_INDEX,0);if(hDev==INVALID_DEVICE_HANDLE){safe_printf("CAN 打开失败\n");return-1;}cfg.can_type=TYPE_CAN;cfg.can.acc_code=0;cfg.can.acc_mask=0xFFFFFFFF;cfg.can.filter=0;cfg.can.timing0=0x00;cfg.can.timing1=0x16;// 250Kcfg.can.mode=0;// ★ 正常模式hCan=ZCAN_InitCAN(hDev,CAN_INDEX,&cfg);ZCAN_StartCAN(hCan);safe_printf("CAN0 已启动(正常模式)\n");_beginthreadex(NULL,0,CanRxThread,hCan,0,NULL);ZCAN_Transmit(hCan,&g_frame_5BB,1);safe_printf("已发送 0x5BB\n");while(!(GetAsyncKeyState(VK_ESCAPE)&0x8000)){Update1BB();Update2BB();ZCAN_Transmit(hCan,g_frames,FRAME_COUNT);Sleep(50);}ZCAN_CloseDevice(hDev);DeleteCriticalSection(&g_printLock);return0;}
http://www.jsqmd.com/news/499717/

相关文章:

  • Asian Beauty Z-Image Turbo保姆级教程:Streamlit多用户会话隔离配置方法
  • GTE-ProRAG生产环境落地:日均百万次请求下的稳定性压测报告
  • 《碳硅“虫洞”解:跨认知区域的可穿越通道》(沙地实验)
  • nlp_structbert_sentence-similarity_chinese-large惊艳效果展示:‘网速慢‘vs‘加载卡顿‘相似度0.84
  • LoRA训练助手技术解析:Qwen3-32B视觉语义对齐能力在tag生成中的体现
  • MusePublic圣光艺苑部署教程:4090显卡一键启动文艺复兴画室
  • Z-Image-Turbo-辉夜巫女部署案例:个人博客集成AI绘画Widget(Gradio iframe嵌入)
  • 蜂窝板实力厂商推荐榜:金刚岩蜂窝板、隐框蜂窝板、OPPR封边蜂窝板、家具蜂窝板、无框蜂窝大板、蜂窝板供应厂家、蜂窝板公司选择指南 - 优质品牌商家
  • EcomGPT电商智能助手部署教程:NVIDIA Triton推理服务器高性能部署方案
  • Streamlit人脸检测工具性能优化:cv_resnet101_face-detection_cvpr22papermogface异步加载方案
  • Phi-4-reasoning-vision-15B部署教程:免配置镜像+Web服务自动恢复方案
  • BGE-Large-Zh惊艳效果:热力图中‘感冒’Query与5文档匹配分差达0.42
  • Qwen3-TTS-1.7B开源模型教程:离散多码本LM架构原理与调用实践
  • 2026年热门的泡浴品牌工厂推荐:非遗泡浴品牌/草本泡浴品牌生产厂家推荐 - 品牌宣传支持者
  • SecGPT-14B实战案例:某省政务云SOC引入SecGPT-14B后MTTD缩短65%
  • 浦语灵笔2.5-7B部署教程:bfloat16混合精度对显存与推理速度影响
  • Qwen2.5-VL-7B-Instruct入门指南:视觉-语言对齐原理与提示词设计技巧
  • 影墨·今颜GPU算力优化教程:24GB显存高效跑通FLUX.1-dev
  • DAMO-YOLO高性能解析:TinyNAS轻量化设计如何平衡参数量与mAP
  • [特殊字符]️cv_resnet101_face-detection_cvpr22papermogface实战教程:从模型加载到JSON坐标提取完整流程
  • 文墨共鸣应用场景:对外汉语教学中的表达多样性识别与反馈系统
  • 2026年口碑好的预制舱厂家推荐:110kv预制舱实力工厂推荐 - 品牌宣传支持者
  • 2026双向电表优质品牌推荐榜:能耗计量电表/远程抄表电表/远程电力抄表/逆流监测电表/零碳工厂能源管理方案/4G电表/选择指南 - 优质品牌商家
  • StructBERT-WebUI保姆级教程:含相似度等级标签(绿/黄/红)解读
  • LiuJuan20260223Zimage入门必看:LoRA权重文件结构解析与自定义替换方法
  • 弦音墨影实操手册:从下载猎豹视频到生成朱砂印章式结果报告的全链路
  • AIGlasses_for_navigation企业应用:住建部门无障碍验收AI辅助工具
  • CosyVoice-300M Lite vs VITS部署案例:资源占用全面对比
  • Qwen3-TTS-VoiceDesign快速上手:3步启动Web界面,用中文描述定制音色风格
  • Qwen3.5-27B惊艳案例:古籍扫描页文字识别+繁体转简体+标点补充