CANcaseXL是Vector的usb CAN适配器,其配套的软件CANoe是个非常强大的软件……

CANoe的介绍改天再说,今天演示一下如何在winform中使用CANcaseXL收发报文

首先得感谢Vector提供的详细文档XL Driver Libary - Description.pdf(此文件在安装盘\Drivers\XL Driver Libary\doc中)

还需要一些dll,如vxlapi_NET20.dll(此文件在安装盘\Drivers\XL Driver Libary\bin中)

当然了,里面还有很多demo可以参考有C++和C#的

1.首先参考文档给出的流程图,文档有介绍函数的作用和参数列表,这里面是C++版本的,和C#版略有不同

2.废话不多说,然后贴代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using vxlapi_NET20;namespace Bootloader
{class DeviceCANcaseXL : ICANDevice{// variables needed by XLDriverprivate static uint hwType = (uint)XLClass.XLhwTypes.XL_HWTYPE_CANCASEXL;private static uint hwIndex = 0;private static uint hwChannel = 0;private static uint busType = (uint)XLClass.XLbusTypes.XL_BUS_TYPE_CAN;private static uint flags = 0;private static int portHandle = -1;private static int eventHandle = -1;private static UInt64 accessMask = 0;private static UInt64 permissionMask = 0;private static UInt64 txMask = 0;private static uint appChannel = 0;private const string applicationName = "Bootloader";private static int channelIndex = 0;public XLDriver xd;private UInt32 responseID;bool ICANDevice.initDevice(int baudRate, UInt32 responseID){XLClass.XLstatus status;xd = new XLDriver();this.responseID = responseID;/* init driver */status = xd.XL_OpenDriver();status = xd.XL_SetApplConfig(applicationName, appChannel, hwType, hwIndex, hwChannel, busType);accessMask = xd.XL_GetChannelMask((int)hwType, (int)hwIndex, (int)hwChannel);permissionMask = accessMask;//必要的status = xd.XL_OpenPort(ref portHandle, applicationName, accessMask, ref permissionMask, 1024, busType);/* setup channels */if (status == XLClass.XLstatus.XL_SUCCESS){status = xd.XL_CanSetChannelBitrate(portHandle, accessMask, (uint)(baudRate * 1000));status = xd.XL_CanSetChannelOutput(portHandle, accessMask, (byte)XLClass.XLoutputModes.XL_OUTPUT_MODE_NORMAL);status = xd.XL_CanSetChannelAcceptance(portHandle, accessMask, responseID, 0x7FF, XLClass.XLacceptanceFilter.XL_CAN_STD);status = xd.XL_CanSetReceiveMode(portHandle, 0, 0);status = xd.XL_SetNotification(portHandle, ref eventHandle, 1);status = xd.XL_ActivateChannel(portHandle, accessMask, busType, flags);/* on bus */xd.XL_ResetClock(portHandle);xd.XL_FlushReceiveQueue(portHandle);xd.XL_CanFlushTransmitQueue(portHandle, accessMask);return true;}elsereturn false;        }bool ICANDevice.closeDevice(){if ((xd.XL_DeactivateChannel(portHandle, accessMask) == XLClass.XLstatus.XL_SUCCESS)&& (xd.XL_ClosePort(portHandle) == XLClass.XLstatus.XL_SUCCESS)&& (xd.XL_CloseDriver() == XLClass.XLstatus.XL_SUCCESS))return true;elsereturn false;}bool ICANDevice.sendData(CAN_DATA cd){XLClass.xl_event xlEvent = new XLClass.xl_event();xlEvent.tag = 0x0A;//必要的xlEvent.tagData.can_Msg.id = cd.ID;xlEvent.tagData.can_Msg.dlc = (ushort)cd.DLC;for (int i = 0; i < cd.DLC; i++)xlEvent.tagData.can_Msg.data[i] = cd.Data[i];XLClass.XLstatus status = xd.XL_CanTransmit(portHandle, accessMask, xlEvent);return (bool)(status == XLClass.XLstatus.XL_SUCCESS);}int ICANDevice.receiveData(ref CAN_DATA[] cdBuffer){int count = 0;XLClass.XLstatus status; XLClass.xl_event xlEvent = new XLClass.xl_event();status = xd.XL_Receive(portHandle, ref xlEvent);while (status == XLClass.XLstatus.XL_SUCCESS && count < 100){if (xlEvent.tagData.can_Msg.dlc > 0 && responseID == xlEvent.tagData.can_Msg.id){cdBuffer[count].DLC = xlEvent.tagData.can_Msg.dlc;cdBuffer[count].ID = xlEvent.tagData.can_Msg.id;cdBuffer[count].channel = 0;cdBuffer[count].isExtendFlag = false;cdBuffer[count].isRemtoeFlag = false;cdBuffer[count].isRx = true;cdBuffer[count].Time = DateTime.Now.Ticks;cdBuffer[count].Data = new byte[8];for (int i = 0; i < cdBuffer[count].DLC; i++){cdBuffer[count].Data[i] = xlEvent.tagData.can_Msg.data[i];}count++;}status = xd.XL_Receive(portHandle, ref xlEvent);}return count;}}
}

其中用到的结构体

public struct CAN_DATA{public UInt32 ID;public int DLC;public byte[] Data;public long Time;public bool isRemtoeFlag;public bool isExtendFlag;public byte channel;public bool isRx;}

使用的接口

namespace Bootloader
{interface ICANDevice{bool initDevice(int baudRate, UInt32 responseID);bool closeDevice();bool sendData(CAN_DATA cd);int receiveData(ref CAN_DATA[] cdBuffer);}
}

当然了,工程中必须添加对vxlapi_NET20的静态引用

需要注意的是:

1.文档注释必要的有两处,这两句必不可少

2.每次发送的是数据都会出现在接收的队列中,以获得时间戳,因此要注意接收数据的区分

C#简单访问CANcaseXL,使用CANcaseXL收发报文相关推荐

  1. nodejs进入mysql数据库_nodejs简单访问及操作mysql数据库的方法示例

    本文实例讲述了nodejs简单访问及操作mysql数据库的方法.分享给大家供大家参考,具体如下: var mysql = require('mysql'); //调用MySQL模块 mysql模块要安 ...

  2. mosquitto查看订阅记录_Mosquitto-PHP 简单实现订阅后的收发消息

    1.先来一张图表示一下基本的收发消息的机制,这个图很简单 2.github 上面有实例大家可以看看 https://github.com/mgdm/Mosquitto-PHP.git 中文官方文档 h ...

  3. html网页设如何置访问密码,利用JS给单页html加上简单访问密码,需要密码才能访问!...

    本文最后更新于[ 2019-12-21 22:28:00 ],某些文章具有时效性,若有错误或已失效,请在下方 留言 或联系 小P君 . 今天在搞一个简单的短域名生成网页的时候,以防被滥用,所以想给h ...

  4. STM32 FMPI2C 简单访问代码

    网上这方面内容较少,又由于DMA Stream全部被占,所以自己写了一个简单的直接访问代码,供需要者参考. 1. 初始化: void InitFMPI2C(void) {     GPIO_InitT ...

  5. 虚拟服务器 端口管理,Apache服务配置虚拟主机(基于域名、端口、IP地址)与简单访问权限管理...

    虚拟Web主机 在同一台物理服务器中运行多个Web站点,其中每一一个站点并不独立占用一台真正的计算机. httpd支持的虚拟主机类型 基于域名的虚拟主机 基于IP地址的虚拟主机 基于端口的虚拟主机 构 ...

  6. IP 层收发报文简要剖析4--ip 报文发送

    无论是从本地输出的数据还是转发的数据报文,经过路由后都要输出到网络设备,而输出到网络设备的接口就是dst_output(output)函数 路由的时候,dst_output函数设置为ip_output ...

  7. IP 层收发报文简要剖析1-ip报文的输入

    ip层数据包处理场景如下: 网络层处理数据包文时需要和路由表以及邻居系统打交道.输入数据时,提供输入接口给链路层调用,并调用传输层的输入接口将数据输入到传输层. 在输出数据时,提供输出接口给传输层,并 ...

  8. appollo消息服务器,搭建Apache apollo消息队列服务、简单访问

    官网:http://activemq.apache.org/apollo/index.html 环境:ubuntu 16.04 1.安装好jdk 2.下载解压 wget http://mirrors. ...

  9. dpdk报文收发流程--理解dma控制器、UIO驱动、描述符空间、mbuf空间、KNI

    1. dpdk报文收发流程 1.1 报文接收流程 传统方式接收报文时,当网卡接收到报文后会产生硬件中断,进而报文会通过协议栈,最后到达应用层,这个过程需要内核协议栈的处理. 和传统报文接收不同,当应用 ...

最新文章

  1. 【学界】深度学习如何影响运筹学?
  2. 恭贺各位鸡年好运,新年快乐,万事如意!!!
  3. HTML之垂直居中问题
  4. BZOJ[1713][Usaco2007 China]The Bovine Accordion and Banjo Orchestra 音乐会 二维斜率优化
  5. cube、rollup及exec的用法实例
  6. python基础教程--代码集合(上)
  7. 使用LinearLayout实现ListView,解决ListView和ScrollView滚动冲突
  8. VS2010插件 - NuGet
  9. d盘信号灯超时时间已到_20下教师资格证笔试成绩什么时候公布?今年面试是什么时候?这些时间节点抢先了解!...
  10. 线控转向——Carsim与simulink联合仿真模型 包含转向电机模型,转向执行机构模型,齿轮齿条模型
  11. Word 怎么在方框里打勾——超级简单的方法,一看就会!
  12. 批处理文件进行音频格式转换
  13. java实现收藏功能
  14. 算法训练:嘘,别人我不告诉TA
  15. 抖音如何开通直播教程
  16. apmserv mysql_解决在本地计算无法启动Apmserv-MySQL5.1服务,错误1067:进程意外终止
  17. exynos4412中断编程
  18. 利用python爬虫大量基金股票的净值写入到csv文件中方便做其他计算
  19. BYOA,也许是IT大叔眼中的新生代萝莉
  20. Mac 系统安装 PyCharm 并使用

热门文章

  1. Blender2.92下载安装教程
  2. https页面打不开
  3. 动态代理、CGlib、AOP
  4. CSS实现字体描边的方法
  5. 苹果nfc功能怎么开启_手机上面的NFC功能怎么用的
  6. requestFullscreen各种浏览器全屏模式的兼容方法记录和在TV项目的应用
  7. breakall lisp文件_dwg导入SU的准备工作
  8. 推荐一些实用的电脑应用
  9. 保存页面文本到本地文件读取本地文件内容到页面
  10. 中兴校园招聘 他人面经整理