创芯科技USB_CAN【库文件】
只用到【只收】【只发】功能
23.11.18
using help;
//using Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.NetworkInformation;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;// 1先引用 CAN_namespace 用于参数类型 // using USB_CAN;
// 2再引用 help的方法namespace CAN_namespace
{#region 全局类型【声明】:通讯接口/// <summary>/// 全局类型:通讯接口/// </summary>public interface Iface_RTX // 开,关,收,发,轮询{/// <summary>/// 连接/// </summary>/// <typeparam name="T">连接</typeparam>/// <param name="a">ip地址</param>/// <param name="b">端口</param>/// <returns></returns>bool connect<T>(T a, T b);/// <summary>/// 断开/// </summary>/// <returns></returns>bool Close();/// <summary>/// 只收/// </summary>/// <returns></returns>int RXs(ref object obj);//int RXs<T>(ref T obj);//测试/// <summary>/// 只发,格式148报文/// </summary>/// <param name="cmd"></param>/// <returns></returns>bool TXs(string cmd);/// <summary>/// 轮询/// </summary>/// <typeparam name="T"></typeparam>/// <param name="cmd"></param>/// <param name="t"></param>/// <returns></returns>bool sendAndReceive<T>(string cmd, ref T t);//万物皆文本}#endregion#region 对象public class Help_USB_CAN : Iface_RTX{//作者qq750273008 祁成 更新日期:2023.11.13//===============================================//[Browsable(true)] //可浏览//[Category("自定义属性")] // 属性分栏//[Description("属性的说明")] ////================================================#region 全局//1申明委托》委托命令public delegate void WT_GET_Data<T>(T ciA402);//↑ui显示发送命令public delegate void WT_SET_Data(byte[] butes, string data);//↓下执行对象#region CAN参数类型:全局;【设备类型,主板信息,单帧信息,配置表/*------------兼容ZLG的数据类型---------------------------------*///1.设备类型/// <summary>/// 设备类型(单路,双路,以太网CAN)/// </summary>public enum DeviceType : byte //设备类型【USB的【单路,双路】,以太网的【单路,双路】can】{DEV_USBCAN = 3, // USB单路CANDEV_USBCAN2 = 4,// USB双路CANVCI_USBCAN1 = 3,VCI_USBCAN2 = 4,// 我买的属于这个(创新科技CAN-Pro)VCI_USBCAN2A = 4,VCI_USBCAN_E_U = 20,// 以太网单路CANVCI_USBCAN_2E_U = 21// 以太网双路CAN}//设备类型public enum CAN设备类型 : int{DEV_USBCAN = 3, // USB单路CANDEV_USBCAN2 = 4,// USB双路CANVCI_USBCAN1 = 3,VCI_USBCAN2 = 4,VCI_USBCAN2A = 4,VCI_USBCAN_E_U = 20,// 以太网单路CANVCI_USBCAN_2E_U = 21// 以太网双路CAN}//2.ZLGCAN系列接口卡信息的数据类型。/// <summary>/// 主板设备【31F01031C93】v3.41 VCI_ReadBoardInfo/// </summary>public struct VCI_BOARD_INFO //主板信息{ // VCI_ReadBoardInfo【要先运行VCI_OpenDevice(4,0,0);】 VCI_FindUsbDevice2public UInt16 hw_Version;//【0x0900】硬件版本,比如0x0100表示V1.00。public UInt16 fw_Version;//【0x0341】固件版本,v3.41public UInt16 dr_Version;//【0x0900】驱动版本,public UInt16 in_Version;//【0x0905】接口版本,public UInt16 irq_Num;// 【0x00】 保留参数。public byte can_Num; // 【0x02】 表示有几路CAN通道。[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]public char[] str_Serial_Num;// 板卡序列号。【31F01031C93】[MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)]public char[] str_hw_Type;// 硬件类型【55 53 42 43 41 4e 2d 49 49】“USBCAN-II”[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]public UInt16[] Reserved;// 系统保留。}//2-1.USB-CAN总线适配器板卡信息的数据类型1,该类型为VCI_FindUsbDevice函数的返回参数。/// <summary>/// USB-CAN设备主板信息,该类型为VCI_FindUsbDevice函数的返回参数。/// </summary>public struct VCI_BOARD_INFO1 // 读取USB主板信息 设备【31F01031C93】v3.41{// VCI_FindUsbDevicepublic UInt16 hw_Version;//【0x0900】 硬件版本,0x0100表示V1.00。 // public UInt16 fw_Version;//【0x0341】 固件版本,v3.41, public UInt16 dr_Version;//【0x0900】 驱动版本,public UInt16 in_Version;//【0x0905】 接口版本, public UInt16 irq_Num;// 【0x0000】 保留参数。public byte can_Num;// 【0x02】 表示有几路CAN通道。public byte Reserved;// 【0x00】 保留。[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]public char[] str_Serial_Num;// 此板卡的序列号。【43 41 4e 2d 31 43 39 33】"CAN-1C93"[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]public char[] str_hw_Type;// 硬件类型“USBCAN V1.00”【55 53 42 43 41 4e 2d 49 49】"USBCAN-II"[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]public char[] str_Usb_Serial;// 序列号【31 43 39 33】// "1C93"}//3.定义CAN每帧的数据类型。/// <summary>/// CAN的每一帧详细信息(每帧对象)/// </summary>public unsafe struct VCI_CAN_OBJ //CAN每帧对象,{public uint ID;// 帧ID。 【u32】帧id,数据格式为靠右对齐。 详情请参照: 《8.附件1: ID对齐方式.pdf》说明文档。public uint TimeStamp; //【u32】设备时间标识。 时间标示从CAN卡上电开始计时,计时单位为0.1ms。public byte TimeFlag; //是否使用时间标识,=1时TimeStamp有效public byte SendType; //发送类型。=0时为正常发送(重发超时时间为1秒,1秒内没有发出则取消);=1时为单次发送public byte RemoteFlag; //是否远程帧标志。 =0时为数据帧, =1时为远程帧(数据段空)。public byte ExternFlag; //是否扩展帧标志。 =0时为标准帧(11位ID), =1时为扩展帧(29位ID)。public byte DataLen; //有效字节 DLC (<=8),即CAN帧Data有几个字节。约束了后面Data[8]中有效字节数。public fixed byte Data[8]; //数据包,如DataLen定义为3,即Data[0]、 Data[1]、 Data[2]是有效的。public fixed byte Reserved[3];//系统保留。}//4.定义配置CAN的数据类型/// <summary>/// USB-CAN2、配置表(参数表)/// </summary>public struct VCI_INIT_CONFIG // 配置参数 设备【31F01031C93】v3.41{public UInt32 AccCode;// bit全部匹配,此帧才可以被接收。否则不能接收。(//标准帧右移21bit分析)// 相当于机械钥匙,凸起和凹槽必须匹配,才能开锁(接收)// b31对应帧id最高位,所以11bit要左移21bit(//分析标准帧时右移21bit)public UInt32 AccMask;// 屏蔽码。使AccCode的某个bit功能失效。左对齐,bit31~bit21置1为屏蔽AccCode的bit匹配功能,// 相当于机械钥匙的bit销位,是否失效(bit置1为失效)// 。屏蔽码推荐设置为0xFFFFFFFF,即全部接收。public UInt32 Reserved;// 保留。public byte Filter; // 1接收所有帧。2只收标准帧,3只收扩展帧。public byte Timing0; //波特率参数,具体配置,请查看二次开发库函数说明书。(1Mbps):《Timing0=0x00,Timing1=0x14》public byte Timing1; // 0x14 波特率参数 1MHz(T0=0x00,T1=0x14)public byte Mode; //模式,0表示正常模式,1表示只听模式,2自测模式(环回模式)。}/*------------其他数据结构描述---------------------------------*/public struct CHGDESIPANDPORT // 扩展端口?{[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]public byte[] szpwd;[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]public byte[] szdesip;public Int32 desport;public void Init(){szpwd = new byte[10];szdesip = new byte[20];}}public struct VCI_FILTER_RECORD //滤帧配置{UInt32 ExtFrame;// 过滤的帧类型【1】过滤扩展帧【0】过滤标准帧。UInt32 Start;//起始帧ID UInt32 End; //结束帧ID }/*------------数据结构描述完成---------------------------------*/#endregion#endregion#region 字段//private CancellationTokenSource cts;//线程令牌//private ManualResetEvent resetEvent = new ManualResetEvent(true);// 暂停业务//=====================================================Help_String help_String = new Help_String();//文本处理//设备类型public const int VCI_USBCAN = 3;// USB单路CANpublic const int VCI_USBCAN2 = 4;// USB双路CAN// E表示以太网public const int VCI_USBCAN_E_U = 20;// 以太网单路CANpublic const int VCI_USBCAN_2E_U = 21;// 以太网双路CANconst uint CAN1 = 0; // 字段,内部使用const uint CAN2 = 1;const byte STATUS_OK = 1;const byte STATUS_ERR = 0;#endregion#region 属性//public Iface_RTX help_rtx { get; set; }// 接口扩展/// <summary>/// ↑:byte包,文本/// </summary>//static public WT_GET_Data Wt_get;//↑event委托=》呼叫上ui层 让上层显示:发送命令/// <summary>/// ↓:byte包,文本/// </summary>static public WT_SET_Data Wt_set;//↓委托=》呼叫下位机执行public VCI_BOARD_INFO1[] get_FindUsbDevice{get{VCI_BOARD_INFO1[] pInfo = new VCI_BOARD_INFO1[5];Int32 num = VCI_FindUsbDevice(ref pInfo[0]);// 查找5个设备return pInfo;}}/// <summary>/// USB设备id:查找50个USB设备【31F01031C93】/// </summary>public VCI_BOARD_INFO[] get_FindUsbDevice2{get{VCI_BOARD_INFO[] pInfo = new VCI_BOARD_INFO[50];UInt32 num = VCI_FindUsbDevice2(ref pInfo[0]);// 查找50个设备return pInfo;}}public VCI_BOARD_INFO get_ReadBoardInfo{get{Set_Open();VCI_BOARD_INFO info = new VCI_BOARD_INFO();Int32 num = VCI_ReadBoardInfo(VCI_USBCAN2, 0, ref info);return info;}}#endregion#region 构造#endregion#region 事件#endregion#region APP方法【 开,关,收,发,复位/// <summary>/// 打开CAN:设备类型,硬件id,CAN通道id,参数表/// </summary>/// <param name="DeviceType"></param>/// <param name="DeviceInd"></param>/// <param name="CANInd"></param>/// <param name="pInitConfig"></param>/// <returns></returns>public Int32 Set_Open()//(DeviceType deviceType, uint deviceID,uint canX, VCI_INIT_CONFIG Config)// 设备类型,设备id,通道,配置参数{//打开CAN:设备类型,硬件索引,CAN通道索引,初始化参数,//查找CAN并打开can1通道Int32 sta = 1;// 故障标记UInt32 DeviceType = (int)VCI_USBCAN2;// 设备类型4【USB双路CAN】UInt32 DeviceInd = 0;// 设备IDVCI_BOARD_INFO1 bord = new VCI_BOARD_INFO1();// 设备信息【结构体】int num = VCI_FindUsbDevice(ref bord);// 查找USB设备【31F01031C93】v3.41if (num < 1){// 找不到设备return 0;}// 配置表VCI_INIT_CONFIG config = new VCI_INIT_CONFIG();// 参数表【结构体】// bit全部匹配,此帧才可以被接收。否则不能接收。【左对齐】(//标准帧右移21bit分析)config.AccCode = 0;//bit【钥匙销子】匹配id,(右移21bit分析【32-11】)b31对应帧id最高位【左对齐】config.AccMask = 0xffffffff;// 屏蔽码。使AccCode的某个bit功能失效。左对齐,【标准帧11bit】bit31~bit21置1为屏蔽AccCode的bit匹配功能,config.Filter = 1;//0或1接收所有帧。2只接收标准帧,3只接收扩展帧。config.Timing0 = 0x00;//波特率 1MHz【T0=0x00,T1=0x14】 // 查手册config.Timing1 = 0x14;config.Mode = 0;//模式,0表示正常模式,1表示只听模式,2表示自发自收模式(环回模式)// usb硬件sta &= VCI_使能设备(DeviceType, DeviceInd);// 通电sta &= VCI_初始化通道(DeviceType, DeviceInd, CAN1, ref config);// CAN 1sta &= VCI_初始化通道(DeviceType, DeviceInd, CAN2, ref config);// CAN 2sta &= VCI_CAN通道工作(DeviceType, DeviceInd, CAN1);// CAN 1//sta &= VCI_CAN通道工作(DeviceType, DeviceInd, CAN2);// CAN 2// 硬件信息【在VCI_OpenDevice运行后才可读设备信息】VCI_BOARD_INFO pInfo = new VCI_BOARD_INFO();// 设备信息Int32 num1 = VCI_ReadBoardInfo(4, 0, ref pInfo);// VCI_ReadBoardInfo VCI_FindUsbDeviceif (num1 >= 1){string 序列号 = new string(pInfo.str_Serial_Num);string 设备名称 = new string(pInfo.str_hw_Type);}return (Int32)(sta == 1 ? 1 : 0);// 1完成,0故障//================================//VCI_INIT_CONFIG config = new VCI_INIT_CONFIG();// 参数表//config.AccCode = 0;// bit全部匹配,此帧才可以被接收。否则不能接收。【左对齐】(//标准帧右移21bit分析)//config.AccMask = 0xffffffff;//全部接收 // 屏蔽码。使AccCode的某个bit功能失效。左对齐,bit31~bit21置1为屏蔽AccCode的bit匹配功能,//config.Filter = 0;//0或1接收所有帧。2标准帧滤波,3是扩展帧滤波。//config.Timing0 = 0x00;//波特率参数 1MHz(T0=0x00,T1=0x14)//config.Timing1 = 0x14;//config.Mode = 0;//模式,0表示正常模式,1表示只听模式,2自测模式//uint i = can.set_Open(Help_USB_CAN.VCI_USBCAN2, 0, 0, ref config);// CAN 1//i &= can.set_Open(Help_USB_CAN.VCI_USBCAN2, 0, 1, ref config);// CAN 2}/// <summary>/// 关闭CAN:设备类型,设备id/// </summary>/// <param name="DeviceType"></param>/// <param name="DeviceInd"></param>/// <returns></returns>public Int32 Set_Close(UInt32 DeviceType, UInt32 DeviceInd)// UInt32 DeviceType, UInt32 DeviceInd{Int32 sta = 1;// 故障标记sta &= VCI_CloseDevice(DeviceType, DeviceInd);//设备关sta &= VCI_UsbDeviceReset(DeviceType, DeviceInd, 0);// 设备复位return sta;}public Int32 Set_ClearBuffer(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd){//设备类型,设备id,通道idInt32 sta = 1;sta &= VCI_ClearBuffer(DeviceType, DeviceInd, CANInd);//sta&= VCI_ClearBuffer(DeviceType, DeviceInd, 1);// CAN2return sta;}/// <summary>/// 接收:设备类型,设备索引,CAN通道索引,参数表,最大帧数2000,超时时间/// </summary>/// <param name="DeviceType">设备类型</param>/// <param name="DeviceInd">设备id</param>/// <param name="CANInd">通道id</param>/// <param name="pReceive">数据包</param>/// <param name="Len">小于2500帧</param>/// <param name="WaitTime">保留=0</param>/// <returns></returns>public Int32 get_Receive(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, ref VCI_CAN_OBJ pReceive, UInt32 Len, Int32 WaitTime){//VCI_CAN_OBJ pReceive 设置为数组,2000帧// 设备类型,设备id,通道id,数据包,帧数,等待时间【保留0】return VCI_Receive(DeviceType, DeviceInd, CANInd, ref pReceive, Len, WaitTime);}/// <summary>/// 发送:设备类型,设备索引,CAN通道索引,参数表,要发帧数/// </summary>/// <param name="DeviceType">设备类型</param>/// <param name="DeviceInd">设备id</param>/// <param name="CANInd">通道id</param>/// <param name="pSend">数据包</param>/// <param name="Len">帧数小于1000</param>/// <returns></returns>public Int32 set_Send(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, ref VCI_CAN_OBJ pSend, UInt32 Len){// 设备类型,设备id,通道id,数据包,帧数return VCI_Transmit(DeviceType, DeviceInd, CANInd, ref pSend, Len);}public Int32 set_ResetCAN(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd){// 复位can通道return VCI_ResetCAN(DeviceType, DeviceInd, CANInd);}/// <summary>/// 获取CAN设备信息【需要先打开设备】/// </summary>/// <param name="DeviceType"></param>/// <param name="DeviceInd"></param>/// <param name="pInfo"></param>/// <returns></returns>public Int32 get_BoardInfo(UInt32 DeviceType, UInt32 DeviceInd, ref VCI_BOARD_INFO pInfo){//需要设备开启后,才能读取return VCI_ReadBoardInfo(DeviceType, DeviceInd, ref pInfo);//=======================================================//VCI_BOARD_INFO info = new VCI_BOARD_INFO();//uint i = can.get_Board(4, 0, ref info);}//==以下不再重要=======================================================================//==以下不再重要========/// <summary>/// 使能硬件:设备类型,设备id。/// </summary>/// <param name="DeviceType">Help_USB_CAN.VCI_USBCAN2 = 4;双路CAN</param>/// <param name="DeviceInd">第1个CAN通道是0</param>/// <param name="Reserved">备用=0</param>/// <returns></returns>public Int32 VCI_使能设备(UInt32 DeviceType, UInt32 DeviceInd){// 相当于 插电return VCI_OpenDevice(DeviceType, DeviceInd, 0x00);// 通电}/// <summary>/// 初始化硬件:can设备类型,设备id,CAN通道id,VCI_INIT_CONFIG初始化参数结构体/// </summary>/// <param name="DeviceType">can设备类型</param>/// <param name="DeviceInd">设备索引0</param>/// <param name="CANInd">CAN通道索引0</param>/// <param name="pInitConfig">VCI_INIT_CONFIG初始化参数结构</param>/// <returns></returns>public Int32 VCI_初始化通道(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, ref VCI_INIT_CONFIG pInitConfig){return VCI_InitCAN(DeviceType, DeviceInd, CANInd, ref pInitConfig);}//设备类型。设备索引,CAN通道索引。初始化参数结构。/// <summary>/// CAN工作:设备类型,设备id,CAN通道id(返回【1】成功; 【0】失败; 【-1】设备不存在或USB掉线。)/// </summary>/// <param name="DeviceType"></param>/// <param name="DeviceInd"></param>/// <param name="CANInd"></param>/// <returns></returns>public Int32 VCI_CAN通道工作(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd){return VCI_StartCAN(DeviceType, DeviceInd, CANInd);}/// <summary>/// CAN发送:设备类型,设备索引,CAN通道索引,VCI_CAN_OBJ数组的首指针,(帧数量 最大为10)/// </summary>/// <param name="DeviceType"></param>/// <param name="DeviceInd"></param>/// <param name="CANInd"></param>/// <param name="pSend"></param>/// <param name="Len"></param>/// <returns></returns>public Int32 VCI_set发送(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, ref VCI_CAN_OBJ pSend, UInt32 Len){return VCI_Transmit(DeviceType, DeviceInd, CANInd, ref pSend, Len);}public Int32 VCI_get缓存区帧数(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd){return VCI_GetReceiveNum(DeviceType, DeviceInd, CANInd);// 缓存区,帧数}/// <summary>/// CAN接收:设备类型,设备id,CAN通道id,VCI_CAN_OBJ数组的首指针,本次接收的最大帧数 2500 ,超时时间ms/// </summary>/// <param name="DeviceType"></param>/// <param name="DeviceInd"></param>/// <param name="CANInd"></param>/// <param name="pReceive"></param>/// <param name="Len"></param>/// <param name="WaitTime"></param>/// <returns></returns>public Int32 VCI_get接收(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, ref VCI_CAN_OBJ pReceive, UInt32 Len, Int32 WaitTime){//VCI_CAN_OBJ[] obj = new VCI_CAN_OBJ[2000];//uint i = can.VCI_get接收(4, 0, 1, ref obj[0], 2000, 0);return VCI_Receive(DeviceType, DeviceInd, CANInd, ref pReceive, Len, WaitTime);}#endregion#region 后台方法#region 元始库方法//方法/*------------兼容ZLG的函数描述---------------------------------*/[DllImport("controlcan.dll")]public static extern Int32 VCI_OpenDevice(UInt32 DeviceType, UInt32 DeviceInd, UInt32 Reserved);//返回值=1,表示操作成功;=0表示操作失败;=-1表示USB-CAN设备不存在或USB掉线。//使能设备//(can通道不工作,只设备工作)[DllImport("controlcan.dll")]public static extern Int32 VCI_CloseDevice(UInt32 DeviceType, UInt32 DeviceInd);//返回值=1,表示操作成功;=0表示操作失败;=-1表示USB-CAN设备不存在或USB掉线。//关闭设备[DllImport("controlcan.dll")]public static extern Int32 VCI_InitCAN(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, ref VCI_INIT_CONFIG pInitConfig);//初始化can通道(参数配置)b31对应帧id最高位,所以11bit要左移21bit[DllImport("controlcan.dll")]public static extern Int32 VCI_ReadBoardInfo(UInt32 DeviceType, UInt32 DeviceInd, ref VCI_BOARD_INFO pInfo);//读取主板信息【需要先VCI_OpenDevice】[DllImport("controlcan.dll")]public static extern Int32 VCI_GetReceiveNum(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd);//缓存区可用帧数(<=2000帧)[DllImport("controlcan.dll")]public static extern Int32 VCI_ClearBuffer(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd);//清空缓存区[DllImport("controlcan.dll")]public static extern Int32 VCI_StartCAN(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd);//CAN通道启动(启动can通道)[DllImport("controlcan.dll")]public static extern Int32 VCI_ResetCAN(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd);//CAN通道复位[DllImport("controlcan.dll")]public static extern Int32 VCI_Transmit(UInt32 DeviceType,UInt32 DeviceInd, UInt32 CANInd, ref VCI_CAN_OBJ pSend,UInt32 Length);//返回实际发送的帧数,=-1表示USB-CAN设备不存在或USB掉线。//Length 最大为1000,建议设为1,每次发送单帧,以提高发送效率//CAN通道发送(单次<=10帧)[DllImport("controlcan.dll")]public static extern Int32 VCI_Receive(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, ref VCI_CAN_OBJ pReceive, UInt32 Len, Int32 WaitTime);//CAN通道接收(函数调用间隔至少应设置在5ms以上。)【Len为单次封顶帧数2500帧被读出/*------------其他函数描述---------------------------------*/[DllImport("controlcan.dll")]public static extern Int32 VCI_ConnectDevice(UInt32 DevType, UInt32 DevIndex);//设备连接[DllImport("controlcan.dll")]public static extern Int32 VCI_UsbDeviceReset(UInt32 DevType, UInt32 DevIndex, UInt32 Reserved);//设备复位[DllImport("controlcan.dll")]public static extern Int32 VCI_FindUsbDevice(ref VCI_BOARD_INFO1 pInfo);//返回前5个设备信息//若计算机中插入多于5个适配器,则使用VCI_FindUsbDevice2函数,最大支持50个USB-CAN适配器。[DllImport("controlcan.dll")]public static extern UInt32 VCI_FindUsbDevice2 (ref VCI_BOARD_INFO pInfo);//如:VCI_BOARD_INFO pInfo[50]。 [DllImport("controlcan.dll")]public static extern Int32 VCI_SetReference(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, UInt32 RefType, ref VCI_FILTER_RECORD pData);//设置滤帧(设备类型,设备id,通道id,参数类型,参数包)【只监听某一范围的帧】//RefType=1,添加滤帧表 指向VCI_FILTER_RECORD结构的指针//RefType=2,启用滤帧表//RefType=3,清除滤帧表。/*------------函数描述结束---------------------------------*/#endregion#endregion#region 窗体移动//private Point mouseOff;//鼠标移动位置变量//private bool leftFlag;//标签是否为左键//private void Frm_MouseDown(object sender, MouseEventArgs e)//鼠标按下//{// if (e.Button == MouseButtons.Left)// {// mouseOff = new Point(-e.X, -e.Y); //得到变量的值// leftFlag = true; //点击左键按下时标注为true;// }//}//private void Frm_MouseMove(object sender, MouseEventArgs e)//鼠标移动//{// if (leftFlag)// {// Point mouseSet = Control.MousePosition;// mouseSet.Offset(mouseOff.X, mouseOff.Y); //设置移动后的位置// //Location = mouseSet;//Form 窗体父类字段// }//}//private void Frm_MouseUp(object sender, MouseEventArgs e)//鼠标松开//{// if (leftFlag)// {// leftFlag = false;//释放鼠标后标注为false;// }//}#endregion#region 错误//try//{// byte[] buffer = Encoding.Default.GetBytes(data);//以计算机的编码发送// serialPort.Write(buffer, 0, buffer.Length);// 开始发送//}//catch (Exception ex) { MessageBox.Show(ex.Message); }//显示错误#endregion#region 接口实现public bool connect<T>(T a, T b){// 打开USB-CAN设备的can1通道//throw new NotImplementedException();int sta = Set_Open();return sta == STATUS_OK ? true : false; // 1完成,0故障}bool Iface_RTX.Close(){//throw new NotImplementedException();if (Set_Close(VCI_USBCAN2, 0) == 1){return true;}return false;}public Int32 RXs(ref object Obj){//throw new NotImplementedException();// 缓存区可用帧数=============================//int i = VCI_GetReceiveNum(Help_USB_CAN.VCI_USBCAN2, CAN_inD, CAN1);// can1VCI_CAN_OBJ[] obj = new VCI_CAN_OBJ[2500];// 创新科技CAN分析仪,单次最大缓存2500帧接收,间隔5ms以上Int32 num = VCI_get接收(VCI_USBCAN2, 0, CAN1, ref obj[0], 2500, 0);// 注意 CAN1 通道if (num > 0)// CAN1接收帧数{Obj = obj;return num;#region 取一帧 【1 4 8】//=================================================//byte[] bytes = new byte[13];//bytes[0] = obj[0].DataLen; // 【1】有效字节//uint id = obj[0].ID; // 帧 id【4】帧id//bytes[1] = (byte)(id >> 24);//bytes[2] = (byte)(id >> 16);//bytes[3] = (byte)(id >> 8);//bytes[4] = (byte)(id & 0xff);//fixed (VCI_CAN_OBJ* p_obj = &obj[0])// 8字节 第一帧//{// bytes[5] = p_obj->Data[0];// 【8】包数据// bytes[6] = p_obj->Data[1];// bytes[7] = p_obj->Data[2];// bytes[8] = p_obj->Data[3];// bytes[9] = p_obj->Data[4];// bytes[10] = p_obj->Data[5];// bytes[11] = p_obj->Data[6];// bytes[12] = p_obj->Data[7];//}//return bytes;#endregion}return 0;}//public int RXs<T>(ref T obj)// 待测试//{// //throw new NotImplementedException();// VCI_CAN_OBJ[] obj2 = new VCI_CAN_OBJ[2000];// 创新科技CAN分析仪最大支持2000帧接收,间隔5ms以上// int num = VCI_get接收(4, 0, CAN1, ref obj2[0], 2000, 50);// if (num > 0)// CAN1接收帧数// {// //obj = obj2.ToList<T>();// return num;// }// return 0;// }public unsafe bool TXs(string cmd)// "08 00000602 4064600000000000" // CAN_namespace.Iface_RTX.{// 1 4 8 (DLC字节,帧id,Byte8数据包)//throw new NotImplementedException();cmd.Replace(" ", "");//去除空白byte[] buffercmd = help_String.StringsToHexBytes(cmd);//准备报文 //去除空白 StringsToHexBytesVCI_CAN_OBJ[] buffer = new VCI_CAN_OBJ[10];string id = cmd.Substring(2, 8);// 从站地址 00000602// 4 buffer[0].ID = Convert.ToUInt32(id, 16);//从站id// 重发功能 0开,1关buffer[0].SendType = 0;//【0】正常,失败有重发 【1】只发单次,失败无重发// 1 buffer[0].DataLen = buffercmd[0];//数据长度 DLC (<=8),即CAN帧Data有几个字节。约束了后面Data[8]中的有效字节。// 8 buffer[0].Data[0] = buffercmd[5];// byte8buffer[0].Data[1] = buffercmd[6];buffer[0].Data[2] = buffercmd[7];buffer[0].Data[3] = buffercmd[8];buffer[0].Data[4] = buffercmd[9];buffer[0].Data[5] = buffercmd[10];buffer[0].Data[6] = buffercmd[11];buffer[0].Data[7] = buffercmd[12];// 上车Int32 ret = VCI_set发送(Help_USB_CAN.VCI_USBCAN2, 0, CAN1, ref buffer[0], 1);// 库函数(发送TXs)if (ret == 1) return true;return false;}public unsafe object sendAndReceive(string stringcmd){//"1803052000018705"//"04000006014000200000000000"//throw new NotImplementedException();stringcmd.Replace(" ", "");//去除空白byte[] buffercmd = help_String.StringsToHexBytes(stringcmd);//准备报文 //去除空白 StringsToHexBytesVCI_CAN_OBJ[] buffer = new VCI_CAN_OBJ[10];string id = stringcmd.Substring(7, 3);// 从站地址buffer[0].ID = Convert.ToUInt32(id, 16);//从站idbuffer[0].SendType = 1;//发送帧类型。=0时为正常发送(发送失败会自动重发,重发超时时间为4秒, 4秒内没有发出则取消);=1时为单次发送buffer[0].DataLen = buffercmd[0];//数据长度 DLC (<=8),即CAN帧Data有几个字节。约束了后面Data[8]中的有效字节。buffer[0].Data[0] = buffercmd[5];buffer[0].Data[1] = buffercmd[6];buffer[0].Data[2] = buffercmd[7];buffer[0].Data[3] = buffercmd[8];buffer[0].Data[4] = buffercmd[9];buffer[0].Data[5] = buffercmd[10];buffer[0].Data[6] = buffercmd[11];buffer[0].Data[7] = buffercmd[12];Int32 ret = set_Send(VCI_USBCAN2, 0, 0, ref buffer[0], 1);// 发1帧//byte[] buff = SendAndReceive(buffer, stringcmd);// 收发报文//if (buff == null) throw new Exception("ACK 未应答。。。");//if (buff != null)//{// string str = help_String.BytesToHexStrings(buff);// return str;//}return null;// 发送后未接收}//public unsafe object RXs()// VCI_CAN_OBJ //CAN帧参数//{// //throw new NotImplementedException();// // 缓存区可用帧数=============================// uint i = VCI_GetReceiveNum(Help_USB_CAN.VCI_USBCAN2, 0, 0);// can1// if (i > 0)// CAN1接收帧数// {// uint CAN1 = 0;// VCI_CAN_OBJ[] obj = new VCI_CAN_OBJ[2000];// 创新科技CAN分析仪最大支持2000帧接收// i = VCI_get接收(4, 0, CAN1, ref obj[0], 1, 0);// 注意 CAN1 通道// #region 取一帧// //=================================================// byte[] bytes = new byte[13];// bytes[0] = obj[0].DataLen; //obj[0].// uint id = obj[0].ID; // 帧 id// bytes[1] = (byte)(id >> 24);// bytes[2] = (byte)(id >> 16);// bytes[3] = (byte)(id >> 8);// bytes[4] = (byte)(id & 0xff);// fixed (VCI_CAN_OBJ* p_obj = &obj[0])// 8字节 第一帧// {// bytes[5] = p_obj->Data[0];// bytes[6] = p_obj->Data[1];// bytes[7] = p_obj->Data[2];// bytes[8] = p_obj->Data[3];// bytes[9] = p_obj->Data[4];// bytes[10] = p_obj->Data[5];// bytes[11] = p_obj->Data[6];// bytes[12] = p_obj->Data[7];// }// return bytes;// #endregion// //return obj;// }// return null;//}//public unsafe object RXs()// VCI_CAN_OBJ //CAN帧参数//{// CAN1 接收// //throw new NotImplementedException();// // 缓存区可用帧数=============================// //Help_Delay.delayTime(0.005);// usb大概3~5ms// int i = VCI_GetReceiveNum(Help_USB_CAN.VCI_USBCAN2, CAN_inD, CAN1);// can1// if (i > 0)// CAN1接收帧数// {// VCI_CAN_OBJ[] obj = new VCI_CAN_OBJ[2000];// 创新科技CAN分析仪最大支持2000帧接收,间隔5ms以上// i = VCI_get接收(4, 0, CAN1, ref obj[0], 2000, 50);// 注意 CAN1 通道// #region 取一帧 【1 4 8】// //=================================================// //byte[] bytes = new byte[13];// //bytes[0] = obj[0].DataLen; // 【1】有效字节// //uint id = obj[0].ID; // 帧 id【4】帧id// //bytes[1] = (byte)(id >> 24);// //bytes[2] = (byte)(id >> 16);// //bytes[3] = (byte)(id >> 8);// //bytes[4] = (byte)(id & 0xff);// //fixed (VCI_CAN_OBJ* p_obj = &obj[0])// 8字节 第一帧// //{// // bytes[5] = p_obj->Data[0];// 【8】包数据// // bytes[6] = p_obj->Data[1];// // bytes[7] = p_obj->Data[2];// // bytes[8] = p_obj->Data[3];// // bytes[9] = p_obj->Data[4];// // bytes[10] = p_obj->Data[5];// // bytes[11] = p_obj->Data[6];// // bytes[12] = p_obj->Data[7];// //}// //return bytes;// #endregion// return obj;// }// return null;//}//public unsafe object TXs(string stringcmd)// "04000006014000200000000000"//{//被CanOpen调用// //throw new NotImplementedException();// stringcmd.Replace(" ", "");//去除空白// byte[] buffercmd = help_String.StringsToHexBytes(stringcmd);//准备报文 //去除空白 StringsToHexBytes// VCI_CAN_OBJ[] buffer = new VCI_CAN_OBJ[10];// string id = stringcmd.Substring(2, 8);// 从站地址 00000601// buffer[0].ID = Convert.ToUInt32(id, 16);//从站id// // 重发功能 0开,1关// buffer[0].SendType = 0;//0(4秒内有重发) 1只发单次// buffer[0].DataLen = buffercmd[0];//数据长度 DLC (<=8),即CAN帧Data有几个字节。约束了后面Data[8]中的有效字节。// buffer[0].Data[0] = buffercmd[5];// byte8// buffer[0].Data[1] = buffercmd[6];// buffer[0].Data[2] = buffercmd[7];// buffer[0].Data[3] = buffercmd[8];// buffer[0].Data[4] = buffercmd[9];// buffer[0].Data[5] = buffercmd[10];// buffer[0].Data[6] = buffercmd[11];// buffer[0].Data[7] = buffercmd[12];// Int32 ret = VCI_set发送(Help_USB_CAN.VCI_USBCAN2, 0, CAN1, ref buffer[0], 1);// 库函数(发送TXs)// return ret;//}//public int Close()//{// //throw new NotImplementedException();// return (int)set_Close((UInt32)CAN设备类型.VCI_USBCAN2, CAN_inD);//}public bool sendAndReceive<T>(string cmd, ref T t){throw new NotImplementedException();}#endregion}#endregion}
相关文章:
创芯科技USB_CAN【库文件】
只用到【只收】【只发】功能 23.11.18 using help; //using Models; using System; using System.Collections.Generic; using System.Linq; using System.Net.NetworkInformation; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using Sys…...
React整理总结(四)
1.过渡动画react-transition-group Transition 与平台无关,不一定使用css实现CSSTransition组件,in属性控制展示隐藏,添加className;有三个状态appear | enter | exit 第一类,开始状态:对于的类是-appear、…...

ajax,axios,fetch
文章目录 ajax工作原理ajax发请求四个步骤创建xmlhttprequest对象设置请求方式设置回调函数发送请求 自封装ajax axiosaxios 特性如何用配置拦截器fetch 三者区别 ajax 工作原理 Ajax的工作原理相当于在用户和服务器之间加了—个中间层(AJAX引擎),使用户操作与服务…...

Java值传递和引用传递
在Java中,有值传递(Pass-by-Value)和引用传递(Pass-by-Reference)两种参数传递方式。 值传递(Pass-by-Value):当使用值传递方式时,方法将参数的副本传递给调用方法。这意…...

FPGA_IIC代码-正点原子 野火 小梅哥 特权同学对比写法(1)
FPGA_IIC代码-正点原子 野火 小梅哥 特权同学对比写法(1) 单字节写时序单字节读时序I2C 控制器设计模块框图scl_high 和 scl_low 产生的时序图状态转移图 Verilog代码 FPGA_IIC代码-正点原子 野火 小梅哥 特权同学对比写法(1) FPG…...

LabVIEW编程开发NI-USRP
LabVIEW编程开发NI-USRP 可编程性是SDR的关键特性,它使人们能够将无线电外围设备转换为先进的无线系统。USRP是市场上最开放、最通用的SDR,可帮助工程师在主机和FPGA上使用各种软件开发工具构建系统。 有多种选项可用于对基于SDR的系统的主机进行编程。…...

ES6中实现继承
本篇文章主要说明在ES6中如何实现继承,学过java的小伙伴,对class这个关键字应该不陌生,ES6中也提供了class这个关键字作为实现类的语法糖,咱们一起实现下ES6中的继承。 实现思路 首先直接通过class来声明一个Teacther类ÿ…...

车载通信架构 —— 新车载总线类型下(以太网)的通信架构
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不…...

ArkTS - HarmonyOS服务卡片(创建)
可以参考官网文档 其中我们在已有的文件中File > New > Service Widget创建你想要的小卡片 本文章发布时目前可使用的模板就三种 有卡片后的new 最终效果...
Zotero在word中插入带超链接的参考文献/交叉引用/跳转参考文献
Zotero以其丰富的插件而闻名,使用起来十分的带劲,最重要的是它是免费的、不卡顿,不像某专业软件。 然而Zotero在word插入参考文献时,无法为参考文献添加超链接,这是一个不得不提的遗憾。 不过,有大佬已经…...
持续集成部署-k8s-配置与存储-配置管理:ConfigMap 的热更新
ConfigMap 的热更新 1. 简介2. 新建 Pod3. 使用 edit 命令编辑修改4. 使用 replace 命令替换修改1. 简介 在 Kubernetes 中,ConfigMap 是用于存储非敏感配置数据的 API 对象,它可以被挂载到 Pod 中作为文件或环境变量。ConfigMap 的热更新指的是在不重启 Pod 的情况下,动态…...
Python文本段落翻译
Python文本段落翻译 1、Translate库2、基本使用 1、Translate库 translate非标准库是Python中可以实现对多种语言进行互相翻译的库,translate可以将原始文本或段落翻译成我们需要的目标语言 translate支持多种语言,常见的例如: zh/zh-CN&…...

Flink(七)【输出算子(Sink)】
前言 今天是我写博客的第 200 篇,恍惚间两年过去了,现在已经是大三的学长了。仍然记得两年前第一次写博客的时候,当时学的应该是 Java 语言,菜的一批,写了就删,怕被人看到丢脸。当时就想着自己一年之后&…...

【自我管理】To-do list已过时?学写Done List培养事业成功感
自我管理:已完成清单(doneList)培养事业成功感 待办事项清单常常让人感到压力山大,让人不想面对工作。但是,你知道吗?除了待办清单之外,还有一个叫做「已完成清单」的东西,它可能更符…...

优思学院|什么是精益生产管理?从一个生活上的故事出发来说明。
你关掉电脑,离开办公室。 一个小时后,你进入家门和孩子们在一起。 你和家人一起吃晚饭。 你的老板打电话来查看你的项目进展。 你哄孩子入睡并给他们读个故事。 作为一个负责任的父母,你想要与孩子们的互动时间增加并提高生活的质量&…...
Swagger-----knife4j框架
简介 使得前后端分离开发更加方便,有利于团队协作 接口的文档在线自动生成,降低后端开发人员编写接口文档的负担 功能测试 Spring已经将Swagger纳入自身的标准,建立了Spring-swagger项目,现在叫Springfox。通过在项目中引入Spri…...

企业数字化过程中数据仓库与商业智能的目标
当前环境下,各领域企业通过数字化相关的一切技术,以数据为基础、以用户为核心,创建一种新的,或对现有商业模式进行重塑就是数字化转型。这种数字化转型给企业带来的效果就像是一次重构,会对企业的业务流程、思维文化、…...
从零开始写一个APM监控程序(一)协议
APM(Application Performance Monitoring)是一种用于监控和管理应用程序性能的解决方案。它通过收集、分析和报告应用程序的性能数据,帮助开发人员和系统管理员更好地了解应用程序的运行状况,识别潜在的性能问题,并进行…...

UDP网络套接字编程
先来说说数据在网络上的传输过程吧,我们知道系统其实终究是根据冯诺依曼来构成的,而网络数据是怎么发的呢? 其实很简单,网络有五层。如下: 如上图,我们知道的是,每层对应的操作系统中的那些地方…...

【苏州元德维康生物医药-注册】
...
用 NGINX 还原真实客户端 IP ngx_mail_realip_module
一、模块作用与使用前提 作用:解析 TCP 会话第一行的 PROXY 协议头,将客户端 IP/端口写回 NGINX 的内部变量,使后续 ngx_mail_proxy_module、认证模块、日志模块都能获取真实来源。 前提:监听指令中必须启用 proxy_protocol&…...
RuoYi前后端分离框架集成手机短信验证码(一)之后端篇
一、背景 本项目基于RuoYi 3.8.9前后端分离框架构建,采用Spring Security实现系统权限管理。作为企业级应用架构的子模块,系统需要与顶层项目实现用户数据无缝对接(以手机号作为统一用户标识),同时承担用户信息采集的重要职能。为此,我们在保留原有账号密码登录方式的基…...
【前端】Vue3 中实现两个组件的动态切换保活
在 Vue3 中实现两个组件的动态切换保活,核心是通过 <component> 动态组件与 <KeepAlive> 缓存组件的组合使用。以下是具体实现方案和进阶技巧: 一、基础实现方案 1. 动态组件 KeepAlive 保活 使用 <component :is> 实现动态切换&am…...

Python 爬虫开发
文章目录 1. 常用库安装2. 基础爬虫开发2.1. 使用 requests 获取网页内容2.2. 使用 BeautifulSoup 解析 HTML2.3. 处理登录与会话 3. 进阶爬虫开发3.1. 处理动态加载内容(Selenium)3.2. 使用Scrapy框架3.3. 分布式爬虫(Scrapy-Redisÿ…...

大语言模型 21 - MCP 自动操作 Figma+Cursor 实现将原型转换为代码
MCP 基本介绍 官方地址: https://modelcontextprotocol.io/introduction “MCP 是一种开放协议,旨在标准化应用程序向大型语言模型(LLM)提供上下文的方式。可以把 MCP 想象成 AI 应用程序的 USB-C 接口。就像 USB-C 提供了一种…...

企业微信内部网页开发流程笔记
背景 基于ai实现企微侧边栏和工作台快速问答小助,需要h5开发,因为流程不清楚摸索半天,所以记录一下 一、网页授权登录 1. 配置步骤 1.1 设置可信域名 登录企业微信管理后台 进入"应用管理" > 选择开发的具体应用 > “网…...

机器学习知识体系:从“找规律”到“做决策”的全过程解析
你可能听说过“机器学习”,觉得它很神秘,像是让电脑自己学会做事。其实,机器学习的本质很简单:通过数据来自动建立规则,从而完成预测或决策任务。 这篇文章将用通俗的语言为你梳理机器学习的知识体系,帮助…...
Spring AI(一)
Spring AI 官网 Spring AI 是一个用于 AI 工程的应用程序框架。其目标是将 Spring 生态系统设计原则(如可移植性和模块化设计)应用于 AI 领域,并将使用 POJO 作为应用程序的构建块推广到 AI 领域。 Spring AI 的核心是解决了 AI 集成的根本挑战:将您的企业数据和 API 与 A…...

Python打卡训练营学习记录Day38
知识点回顾: Dataset类的__getitem__和__len__方法(本质是python的特殊方法)Dataloader类minist手写数据集的了解 作业:了解下cifar数据集,尝试获取其中一张图片 import torch import torch.nn as nn import torch.opt…...
电脑装的数据越多,会不会越重
在这个数字化飞速发展的时代,有一个看似荒诞却又引人深思的问题:电脑装的数据越多,会不会越重? 先来说说大家的普遍认知,我们通常认为数据只是一些虚拟的代码和信息,存放在电脑的硬盘或其他存储设备中&…...