å¨ç«åCAN pciæ¥å£å¡æä¾ç示ä¾ä»£ç é½æ¯VCï¼VBåDelphiçï¼æ²¡æC#.netçä¾åãä½æ¯å¨ä½¿ç¨C#è°ç¨CAN apiçæ¶åï¼ç±äºè¿äºapi对æ°æ®ç±»åçæ ¡éªéå¸¸ä¸¥æ ¼ï¼æ以ï¼è°è¯èµ·æ¥æ¯è¾éº»ç¦ãæ¸ç´¢äºä¸æ®µæ¶é´ï¼ç»äºä½¿ç¨C# 2.0 VS.2008è°ç¨CAN apiå¯ä»¥æ£å¸¸çåéæ¥æ¶æ°æ®äºã
ç°å¨æAPIç声ææä¾å¦ä¸ï¼æåæ ·éæ±çï¼å°±å¯ä»¥å°èµ°å¾å¤å¼¯è·¯äºãpublic sealed class CANApi { //æ¥å£å¡ç±»åå®ä¹ public enum PCIDeviceType { VCI_PCI5121 =1, VCI_PCI9810 =2, VCI_USBCAN1 =3, VCI_USBCAN2 =4, VCI_PCI9820 =5, VCI_CAN232 =6, VCI_PCI5110 =7, VCI_CANLITE =8, VCI_ISA9620 =9, VCI_ISA5420 =10, VCI_PC104CAN = 11, VCI_CANETE =12, VCI_DNP9810 =13, VCI_PCI9840 =14, VCI_PCI9820I =16 } //å½æ°è°ç¨è¿åç¶æå¼ public static readonly int STATUS_OK =1; public static readonly int STATUS_ERR =0; public enum ErrorType { //CANé误ç ERR_CAN_OVERFLOW =0x0001, //CANæ§å¶å¨å é¨FIFOæº¢åº ERR_CAN_ERRALARM =0x0002, //CANæ§å¶å¨é误æ¥è¦ ERR_CAN_PASSIVE =0x0004, //CANæ§å¶å¨æ¶æé误 ERR_CAN_LOSE =0x0008, //CANæ§å¶å¨ä»²è£ä¸¢å¤± ERR_CAN_BUSERR =0x0010, //CANæ§å¶å¨æ»çº¿é误 //éç¨é误ç ERR_DEVICEOPENED =0x0100, //设å¤å·²ç»æå¼ ERR_DEVICEOPEN =0x0200, //æå¼è®¾å¤é误 ERR_DEVICENOTOPEN =0x0400, //设å¤æ²¡ææå¼ ERR_BUFFEROVERFLOW =0x0800, //ç¼å²åºæº¢åº ERR_DEVICENOTEXIST =0x1000, //æ¤è®¾å¤ä¸åå¨ ERR_LOADKERNELDLL =0x2000, //è£ è½½å¨æåºå¤±è´¥ ERR_CMDFAILED =0x4000, //æ§è¡å½ä»¤å¤±è´¥é误ç ERR_BUFFERCREATE =0x8000 //å åä¸è¶³ } //1.ZLGCANç³»åæ¥å£å¡ä¿¡æ¯çæ°æ®ç±»åã [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct VCI_BOARD_INFO { public ushort hw_Version; public ushort fw_Version; public ushort dr_Version; public ushort in_Version; public ushort irq_Num; public byte can_Num; [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst = 20)] public string str_Serial_Num; [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst = 40)] public string str_hw_Type; [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst = 4, ArraySubType = System.Runtime.InteropServices.UnmanagedType.U2)] public ushort[] Reserved; } //2.å®ä¹CANä¿¡æ¯å¸§çæ°æ®ç±»åã [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct VCI_CAN_OBJ { public uint ID; public uint TimeStamp; public byte TimeFlag; public byte SendType; public byte RemoteFlag;//æ¯å¦æ¯è¿ç¨å¸§ public byte ExternFlag;//æ¯å¦æ¯æ©å±å¸§ public byte DataLen; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8, ArraySubType = UnmanagedType.I1)] public byte[] Data; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3, ArraySubType = UnmanagedType.I1)] public byte[] Reserved; } //3.å®ä¹CANæ§å¶å¨ç¶æçæ°æ®ç±»åã [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct VCI_CAN_STATUS { public byte ErrInterrupt; public byte regMode; public byte regStatus; public byte regALCapture; public byte regECCapture; public byte regEWLimit; public byte regRECounter; public byte regTECounter; public uint Reserved; } //4.å®ä¹é误信æ¯çæ°æ®ç±»åã [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct VCI_ERR_INFO { public uint ErrCode; [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst = 3, ArraySubType = System.Runtime.InteropServices.UnmanagedType.I1)] public byte[] Passive_ErrData; public byte ArLost_ErrData; } //5.å®ä¹åå§åCANçæ°æ®ç±»å [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct VCI_INIT_CONFIG { public uint AccCode; public uint AccMask; public uint Reserved; public byte Filter; public byte Timing0; public byte Timing1; public byte Mode; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct CHGDESIPANDPORT { [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst = 10)] public string szpwd; [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst = 20)] public string szdesip; public int desport; } #region APIå½æ° [DllImport("ControlCAN.dll", EntryPoint = "VCI_OpenDevice", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern uint VCI_OpenDevice(uint DeviceType, uint DeviceInd, uint Reserved); [DllImport("ControlCAN.dll", EntryPoint = "VCI_CloseDevice", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern uint VCI_CloseDevice(uint DeviceType, uint DeviceInd); [DllImport("ControlCAN.dll", EntryPoint = "VCI_InitCAN", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern uint VCI_InitCAN(uint DeviceType, uint DeviceInd, uint CANInd, ref VCI_INIT_CONFIG pInitConfig); [DllImport("ControlCAN.dll", EntryPoint = "VCI_ReadBoardInfo", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern uint VCI_ReadBoardInfo(uint DeviceType, uint DeviceInd, ref VCI_BOARD_INFO pInfo); [DllImport("ControlCAN.dll", EntryPoint = "VCI_ReadErrInfo", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern uint VCI_ReadErrInfo(uint DeviceType, uint DeviceInd, uint CANInd, ref VCI_ERR_INFO pErrInfo); [DllImport("ControlCAN.dll", EntryPoint = "VCI_ReadCANStatus", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern uint VCI_ReadCANStatus(uint DeviceType, uint DeviceInd, uint CANInd, ref VCI_CAN_STATUS pCANStatus); [DllImport("ControlCAN.dll", EntryPoint = "VCI_GetReference", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern uint VCI_GetReference(uint DeviceType, uint DeviceInd, uint CANInd, uint RefType, object pData); [DllImport("ControlCAN.dll", EntryPoint = "VCI_SetReference", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern uint VCI_SetReference(uint DeviceType, uint DeviceInd, uint CANInd, uint RefType, object pData); [DllImport("ControlCAN.dll", EntryPoint = "VCI_GetReceiveNum", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern uint VCI_GetReceiveNum(uint DeviceType, uint DeviceInd, uint CANInd); [DllImport("ControlCAN.dll", EntryPoint = "VCI_ClearBuffer", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern uint VCI_ClearBuffer(uint DeviceType, uint DeviceInd, uint CANInd); [DllImport("ControlCAN.dll", EntryPoint = "VCI_StartCAN", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern uint VCI_StartCAN(uint DeviceType, uint DeviceInd, uint CANInd); [DllImport("ControlCAN.dll", EntryPoint = "VCI_ResetCAN", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern uint VCI_ResetCAN(uint DeviceType, uint DeviceInd, uint CANInd); [DllImport("ControlCAN.dll", EntryPoint = "VCI_Transmit", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern uint VCI_Transmit(uint DeviceType, uint DeviceInd, uint CANInd, ref VCI_CAN_OBJ pSend, uint Len); [DllImport("ControlCAN.dll", EntryPoint = "VCI_Receive", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern uint VCI_Receive(uint DeviceType, uint DeviceInd, uint CANInd, ref VCI_CAN_OBJ pReceive, uint Len, int WaitTime); #endregion }
注æï¼å¨ä½¿ç¨è¿ç¨ä¸ï¼éè¦æControlCAN.dll并kerneldllsæ件夹åå ¶ä¸é¢çææDLLé½æ·»å å°å·¥ç¨ä¸ï¼å¹¶ä¸æè¿äºæ件çâCopyå°è¾åºæ件âå±æ§è®¾ç½®ä¸ºâ常æ·è´âã
åéåæ¥æ¶æ¯è¾ç容æåºé®é¢ï¼ç¤ºä¾ä»£ç å¦ä¸ï¼
CANApi.VCI_CAN_OBJ[] frameInfo = new CANApi.VCI_CAN_OBJ[1]; frameInfo[0].DataLen = (byte)(ss.Length); frameInfo[0].Data = data; frameInfo[0].Reserved = new byte[3]; frameInfo[0].RemoteFlag = (byte)this.combFrameFormat.SelectedIndex; frameInfo[0].ExternFlag = (byte)this.combFrameType.SelectedIndex; uint frameID = 0; if (!uint.TryParse(this.txtFrameID.Text, System.Globalization.NumberStyles.AllowHexSpecifier, null, out frameID)) frameID = 0; if (frameInfo[0].ExternFlag == 1) { frameInfo[0].ID = frameID; } else { frameInfo[0].ID = frameID | 0x0000FFFF; } frameInfo[0].SendType = (byte)this.combSendFormat.SelectedIndex; CANApi.VCI_Transmit(this.mDeviceType, this.mDeviceIndex, this.mCANIndex, ref frameInfo[0], 1);
CANApi.VCI_CAN_OBJ[] frameInfos = new CANApi.VCI_CAN_OBJ[50]; len = (int)CANApi.VCI_Receive(this.mDeviceType, this.mDeviceIndex, this.mCANIndex, ref frameInfos[0], 50, 200); if (len <= 0) { //注æï¼å¦æ没æ读å°æ°æ®åå¿ é¡»è°ç¨æ¤å½æ°æ¥è¯»ååºå½åçé误ç ï¼ //åä¸ä¸è½çç¥è¿ä¸æ¥ï¼å³ä½¿ä½ å¯è½ä¸æ³ç¥éé误ç æ¯ä»ä¹ï¼ CANApi.VCI_ReadErrInfo(this.mDeviceType, this.mDeviceIndex, this.mCANIndex, ref errInfo); } else {...
è¿è¡ææå¾å¦ä¸ï¼