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

创芯科技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 与平台无关&#xff0c;不一定使用css实现CSSTransition组件&#xff0c;in属性控制展示隐藏&#xff0c;添加className&#xff1b;有三个状态appear | enter | exit 第一类&#xff0c;开始状态&#xff1a;对于的类是-appear、…...

ajax,axios,fetch

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

Java值传递和引用传递

在Java中&#xff0c;有值传递&#xff08;Pass-by-Value&#xff09;和引用传递&#xff08;Pass-by-Reference&#xff09;两种参数传递方式。 值传递&#xff08;Pass-by-Value&#xff09;&#xff1a;当使用值传递方式时&#xff0c;方法将参数的副本传递给调用方法。这意…...

FPGA_IIC代码-正点原子 野火 小梅哥 特权同学对比写法(1)

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

LabVIEW编程开发NI-USRP

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

ES6中实现继承

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

车载通信架构 —— 新车载总线类型下(以太网)的通信架构

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗你的人和事&#xff0c;多看一眼都是你的不…...

ArkTS - HarmonyOS服务卡片(创建)

可以参考官网文档 其中我们在已有的文件中File > New > Service Widget创建你想要的小卡片 本文章发布时目前可使用的模板就三种 有卡片后的new 最终效果...

Zotero在word中插入带超链接的参考文献/交叉引用/跳转参考文献

Zotero以其丰富的插件而闻名&#xff0c;使用起来十分的带劲&#xff0c;最重要的是它是免费的、不卡顿&#xff0c;不像某专业软件。 然而Zotero在word插入参考文献时&#xff0c;无法为参考文献添加超链接&#xff0c;这是一个不得不提的遗憾。 不过&#xff0c;有大佬已经…...

持续集成部署-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中可以实现对多种语言进行互相翻译的库&#xff0c;translate可以将原始文本或段落翻译成我们需要的目标语言 translate支持多种语言&#xff0c;常见的例如&#xff1a; zh/zh-CN&…...

Flink(七)【输出算子(Sink)】

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

【自我管理】To-do list已过时?学写Done List培养事业成功感

自我管理&#xff1a;已完成清单&#xff08;doneList&#xff09;培养事业成功感 待办事项清单常常让人感到压力山大&#xff0c;让人不想面对工作。但是&#xff0c;你知道吗&#xff1f;除了待办清单之外&#xff0c;还有一个叫做「已完成清单」的东西&#xff0c;它可能更符…...

优思学院|什么是精益生产管理?从一个生活上的故事出发来说明。

你关掉电脑&#xff0c;离开办公室。 一个小时后&#xff0c;你进入家门和孩子们在一起。 你和家人一起吃晚饭。 你的老板打电话来查看你的项目进展。 你哄孩子入睡并给他们读个故事。 作为一个负责任的父母&#xff0c;你想要与孩子们的互动时间增加并提高生活的质量&…...

Swagger-----knife4j框架

简介 使得前后端分离开发更加方便&#xff0c;有利于团队协作 接口的文档在线自动生成&#xff0c;降低后端开发人员编写接口文档的负担 功能测试 Spring已经将Swagger纳入自身的标准&#xff0c;建立了Spring-swagger项目&#xff0c;现在叫Springfox。通过在项目中引入Spri…...

企业数字化过程中数据仓库与商业智能的目标

当前环境下&#xff0c;各领域企业通过数字化相关的一切技术&#xff0c;以数据为基础、以用户为核心&#xff0c;创建一种新的&#xff0c;或对现有商业模式进行重塑就是数字化转型。这种数字化转型给企业带来的效果就像是一次重构&#xff0c;会对企业的业务流程、思维文化、…...

从零开始写一个APM监控程序(一)协议

APM&#xff08;Application Performance Monitoring&#xff09;是一种用于监控和管理应用程序性能的解决方案。它通过收集、分析和报告应用程序的性能数据&#xff0c;帮助开发人员和系统管理员更好地了解应用程序的运行状况&#xff0c;识别潜在的性能问题&#xff0c;并进行…...

UDP网络套接字编程

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

【苏州元德维康生物医药-注册】

...

用 NGINX 还原真实客户端 IP ngx_mail_realip_module

一、模块作用与使用前提 作用&#xff1a;解析 TCP 会话第一行的 PROXY 协议头&#xff0c;将客户端 IP/端口写回 NGINX 的内部变量&#xff0c;使后续 ngx_mail_proxy_module、认证模块、日志模块都能获取真实来源。 前提&#xff1a;监听指令中必须启用 proxy_protocol&…...

RuoYi前后端分离框架集成手机短信验证码(一)之后端篇

一、背景 本项目基于RuoYi 3.8.9前后端分离框架构建,采用Spring Security实现系统权限管理。作为企业级应用架构的子模块,系统需要与顶层项目实现用户数据无缝对接(以手机号作为统一用户标识),同时承担用户信息采集的重要职能。为此,我们在保留原有账号密码登录方式的基…...

【前端】Vue3 中实现两个组件的动态切换保活

在 Vue3 中实现两个组件的动态切换保活&#xff0c;核心是通过 <component> 动态组件与 <KeepAlive> 缓存组件的组合使用。以下是具体实现方案和进阶技巧&#xff1a; 一、基础实现方案 1. 动态组件 KeepAlive 保活 使用 <component :is> 实现动态切换&am…...

Python 爬虫开发

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

大语言模型 21 - MCP 自动操作 Figma+Cursor 实现将原型转换为代码

MCP 基本介绍 官方地址&#xff1a; https://modelcontextprotocol.io/introduction “MCP 是一种开放协议&#xff0c;旨在标准化应用程序向大型语言模型&#xff08;LLM&#xff09;提供上下文的方式。可以把 MCP 想象成 AI 应用程序的 USB-C 接口。就像 USB-C 提供了一种…...

企业微信内部网页开发流程笔记

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

机器学习知识体系:从“找规律”到“做决策”的全过程解析

你可能听说过“机器学习”&#xff0c;觉得它很神秘&#xff0c;像是让电脑自己学会做事。其实&#xff0c;机器学习的本质很简单&#xff1a;通过数据来自动建立规则&#xff0c;从而完成预测或决策任务。 这篇文章将用通俗的语言为你梳理机器学习的知识体系&#xff0c;帮助…...

Spring AI(一)

Spring AI 官网 Spring AI 是一个用于 AI 工程的应用程序框架。其目标是将 Spring 生态系统设计原则(如可移植性和模块化设计)应用于 AI 领域,并将使用 POJO 作为应用程序的构建块推广到 AI 领域。 Spring AI 的核心是解决了 AI 集成的根本挑战:将您的企业数据和 API 与 A…...

Python打卡训练营学习记录Day38

知识点回顾&#xff1a; Dataset类的__getitem__和__len__方法&#xff08;本质是python的特殊方法&#xff09;Dataloader类minist手写数据集的了解 作业&#xff1a;了解下cifar数据集&#xff0c;尝试获取其中一张图片 import torch import torch.nn as nn import torch.opt…...

电脑装的数据越多,会不会越重

在这个数字化飞速发展的时代&#xff0c;有一个看似荒诞却又引人深思的问题&#xff1a;电脑装的数据越多&#xff0c;会不会越重&#xff1f; 先来说说大家的普遍认知&#xff0c;我们通常认为数据只是一些虚拟的代码和信息&#xff0c;存放在电脑的硬盘或其他存储设备中&…...