实例介绍
【实例简介】
【实例截图】
【核心代码】
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; //1.ZLGCAN系列接口卡信息的数据类型。 public struct VCI_BOARD_INFO { public UInt16 hw_Version; public UInt16 fw_Version; public UInt16 dr_Version; public UInt16 in_Version; public UInt16 irq_Num; public byte can_Num; [MarshalAs(UnmanagedType.ByValArray, SizeConst=20)] public byte []str_Serial_Num; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)] public byte[] str_hw_Type; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public byte[] Reserved; } ///////////////////////////////////////////////////// //2.定义CAN信息帧的数据类型。 unsafe 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; public fixed byte Data[8]; public fixed byte Reserved[3]; } ////2.定义CAN信息帧的数据类型。 //public struct VCI_CAN_OBJ //{ // public UInt32 ID; // public UInt32 TimeStamp; // public byte TimeFlag; // public byte SendType; // public byte RemoteFlag;//是否是远程帧 // public byte ExternFlag;//是否是扩展帧 // public byte DataLen; // [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] // public byte[] Data; // [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] // public byte[] Reserved; // public void Init() // { // Data = new byte[8]; // Reserved = new byte[3]; // } //} //3.定义CAN控制器状态的数据类型。 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; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] Reserved; } //4.定义错误信息的数据类型。 public struct VCI_ERR_INFO { public UInt32 ErrCode; public byte Passive_ErrData1; public byte Passive_ErrData2; public byte Passive_ErrData3; public byte ArLost_ErrData; } //5.定义初始化CAN的数据类型 public struct VCI_INIT_CONFIG { public UInt32 AccCode; public UInt32 AccMask; public UInt32 Reserved; public byte Filter; public byte Timing0; public byte Timing1; public byte Mode; } 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]; } } ///////// new add struct for filter ///////// //typedef struct _VCI_FILTER_RECORD{ // DWORD ExtFrame; //是否为扩展帧 // DWORD Start; // DWORD End; //}VCI_FILTER_RECORD,*PVCI_FILTER_RECORD; public struct VCI_FILTER_RECORD { public UInt32 ExtFrame; public UInt32 Start; public UInt32 End; } namespace WindowsApplication1 { public partial class Form1 : Form { const int VCI_PCI5121 = 1; const int VCI_PCI9810 = 2; const int VCI_USBCAN1 = 3; const int VCI_USBCAN2 = 4; const int VCI_USBCAN2A = 4; const int VCI_PCI9820 = 5; const int VCI_CAN232 = 6; const int VCI_PCI5110 = 7; const int VCI_CANLITE = 8; const int VCI_ISA9620 = 9; const int VCI_ISA5420 = 10; const int VCI_PC104CAN = 11; const int VCI_CANETUDP = 12; const int VCI_CANETE = 12; const int VCI_DNP9810 = 13; const int VCI_PCI9840 = 14; const int VCI_PC104CAN2 = 15; const int VCI_PCI9820I = 16; const int VCI_CANETTCP = 17; const int VCI_PEC9920 = 18; const int VCI_PCI5010U = 19; const int VCI_USBCAN_E_U = 20; const int VCI_USBCAN_2E_U = 21; const int VCI_PCI5020U = 22; const int VCI_EG20T_CAN = 23; /// <summary> /// /// </summary> /// <param name="DeviceType"></param> /// <param name="DeviceInd"></param> /// <param name="Reserved"></param> /// <returns></returns> [DllImport("controlcan.dll")] static extern UInt32 VCI_OpenDevice(UInt32 DeviceType, UInt32 DeviceInd, UInt32 Reserved); [DllImport("controlcan.dll")] static extern UInt32 VCI_CloseDevice(UInt32 DeviceType, UInt32 DeviceInd); [DllImport("controlcan.dll")] static extern UInt32 VCI_InitCAN(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, ref VCI_INIT_CONFIG pInitConfig); [DllImport("controlcan.dll")] static extern UInt32 VCI_ReadBoardInfo(UInt32 DeviceType, UInt32 DeviceInd, ref VCI_BOARD_INFO pInfo); [DllImport("controlcan.dll")] static extern UInt32 VCI_ReadErrInfo(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, ref VCI_ERR_INFO pErrInfo); [DllImport("controlcan.dll")] static extern UInt32 VCI_ReadCANStatus(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, ref VCI_CAN_STATUS pCANStatus); [DllImport("controlcan.dll")] static extern UInt32 VCI_GetReference(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, UInt32 RefType, ref byte pData); [DllImport("controlcan.dll")] //static extern UInt32 VCI_SetReference(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, UInt32 RefType, ref byte pData); unsafe static extern UInt32 VCI_SetReference(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, UInt32 RefType, byte* pData); [DllImport("controlcan.dll")] static extern UInt32 VCI_GetReceiveNum(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd); [DllImport("controlcan.dll")] static extern UInt32 VCI_ClearBuffer(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd); [DllImport("controlcan.dll")] static extern UInt32 VCI_StartCAN(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd); [DllImport("controlcan.dll")] static extern UInt32 VCI_ResetCAN(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd); [DllImport("controlcan.dll")] static extern UInt32 VCI_Transmit(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, ref VCI_CAN_OBJ pSend, UInt32 Len); //[DllImport("controlcan.dll")] //static extern UInt32 VCI_Receive(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, ref VCI_CAN_OBJ pReceive, UInt32 Len, Int32 WaitTime); [DllImport("controlcan.dll", CharSet = CharSet.Ansi)] static extern UInt32 VCI_Receive(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, IntPtr pReceive, UInt32 Len, Int32 WaitTime); //static UInt32 m_devtype = 4;//USBCAN2 static UInt32 m_devtype = 21;//USBCAN-2e-u //usb-e-u 波特率 static UInt32[] GCanBrTab = new UInt32[10]{ 0x060003, 0x060004, 0x060007, 0x1C0008, 0x1C0011, 0x160023, 0x1C002C, 0x1600B3, 0x1C00E0, 0x1C01C1 }; //////////////////////////////////////// const UInt32 STATUS_OK = 1; UInt32 m_bOpen = 0; UInt32 m_devind = 0; UInt32 m_canind = 0; VCI_CAN_OBJ[] m_recobj = new VCI_CAN_OBJ[50]; UInt32[] m_arrdevtype = new UInt32[20]; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { comboBox_DevIndex.SelectedIndex = 0; comboBox_CANIndex.SelectedIndex = 0; textBox_AccCode.Text = "00000000"; textBox_AccMask.Text = "FFFFFFFF"; textBox_Time0.Text = "00"; textBox_Time1.Text = "14"; comboBox_Filter.SelectedIndex = 1; comboBox_Mode.SelectedIndex = 0; comboBox_SendType.SelectedIndex = 2; comboBox_FrameFormat.SelectedIndex = 0; comboBox_FrameType.SelectedIndex = 0; textBox_ID.Text = "00000123"; textBox_Data.Text = "00 01 02 03 04 05 06 07 "; comboBox_e_u_baud.SelectedIndex = 0;//1000Kbps comboBox_e_u_Filter.SelectedIndex = 2;//禁用 textBox_e_u_startid.Text = "1"; textBox_e_u_endid.Text = "ff"; // Int32 curindex = 0; comboBox_devtype.Items.Clear(); curindex = comboBox_devtype.Items.Add("USBCAN_E_U"); m_arrdevtype[curindex] = VCI_USBCAN_E_U; curindex = comboBox_devtype.Items.Add("USBCAN_2E_U"); m_arrdevtype[curindex] = VCI_USBCAN_2E_U; curindex = comboBox_devtype.Items.Add("PCI5010U"); m_arrdevtype[curindex] = VCI_PCI5010U; curindex = comboBox_devtype.Items.Add("PCI5020U"); m_arrdevtype[curindex] = VCI_PCI5020U; comboBox_devtype.SelectedIndex = 3; comboBox_devtype.MaxDropDownItems = comboBox_devtype.Items.Count; } private void Form1_FormClosed(object sender, FormClosedEventArgs e) { if (m_bOpen==1) { VCI_CloseDevice(m_devtype, m_devind); } } unsafe private void buttonConnect_Click(object sender, EventArgs e) { if (m_bOpen==1) { VCI_CloseDevice(m_devtype, m_devind); m_bOpen = 0; } else { m_devtype = m_arrdevtype[comboBox_devtype.SelectedIndex]; m_devind=(UInt32)comboBox_DevIndex.SelectedIndex; m_canind = (UInt32)comboBox_CANIndex.SelectedIndex; if (VCI_OpenDevice(m_devtype, m_devind, 0) == 0) { MessageBox.Show("打开设备失败,请检查设备类型和设备索引号是否正确", "错误", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } //USB-E-U 代码 UInt32 baud; baud = GCanBrTab[comboBox_e_u_baud.SelectedIndex]; if (VCI_SetReference(m_devtype, m_devind, m_canind, 0, (byte*)&baud) != STATUS_OK) { MessageBox.Show("设置波特率错误,打开设备失败!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); VCI_CloseDevice(m_devtype, m_devind); return; } //滤波设置 ////////////////////////////////////////////////////////////////////////// m_bOpen = 1; VCI_INIT_CONFIG config=new VCI_INIT_CONFIG(); config.AccCode=System.Convert.ToUInt32("0x" textBox_AccCode.Text,16); config.AccMask = System.Convert.ToUInt32("0x" textBox_AccMask.Text, 16); config.Timing0 = System.Convert.ToByte("0x" textBox_Time0.Text, 16); config.Timing1 = System.Convert.ToByte("0x" textBox_Time1.Text, 16); config.Filter = (Byte)comboBox_Filter.SelectedIndex; config.Mode = (Byte)comboBox_Mode.SelectedIndex; VCI_InitCAN(m_devtype, m_devind, m_canind, ref config); ////////////////////////////////////////////////////////////////////////// Int32 filterMode = comboBox_e_u_Filter.SelectedIndex; if (2!=filterMode)//不是禁用 { VCI_FILTER_RECORD filterRecord=new VCI_FILTER_RECORD(); filterRecord.ExtFrame = (UInt32)filterMode; filterRecord.Start = System.Convert.ToUInt32("0x" textBox_e_u_startid.Text, 16); filterRecord.End = System.Convert.ToUInt32("0x" textBox_e_u_endid.Text, 16); //填充滤波表格 VCI_SetReference(m_devtype, m_devind, m_canind, 1, (byte*)&filterRecord); //使滤波表格生效 byte tm = 0; if (VCI_SetReference(m_devtype, m_devind, m_canind, 2, &tm) != STATUS_OK) { MessageBox.Show("设置滤波失败", "错误", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); VCI_CloseDevice(m_devtype, m_devind); return; } } ////////////////////////////////////////////////////////////////////////// } buttonConnect.Text = m_bOpen==1?"断开":"连接"; timer_rec.Enabled = m_bOpen==1?true:false; } unsafe private void timer_rec_Tick(object sender, EventArgs e) { UInt32 res = new UInt32(); res=VCI_GetReceiveNum(m_devtype,m_devind,m_canind); if(res==0) return; //res = VCI_Receive(m_devtype, m_devind, m_canind, ref m_recobj[0],50, 100); ///////////////////////////////////// UInt32 con_maxlen = 50; IntPtr pt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(VCI_CAN_OBJ)) * (Int32)con_maxlen); res = VCI_Receive(m_devtype, m_devind, m_canind, pt, con_maxlen, 100); //////////////////////////////////////////////////////// String str = ""; for (UInt32 i = 0; i < res; i ) { VCI_CAN_OBJ obj = (VCI_CAN_OBJ)Marshal.PtrToStructure((IntPtr)((UInt32)pt i * Marshal.SizeOf(typeof(VCI_CAN_OBJ))), typeof(VCI_CAN_OBJ)); str = "接收到数据: "; str = " 帧ID:0x" System.Convert.ToString((Int32)obj.ID, 16); str = " 帧格式:"; if (obj.RemoteFlag == 0) str = "数据帧 "; else str = "远程帧 "; if (obj.ExternFlag == 0) str = "标准帧 "; else str = "扩展帧 "; ////////////////////////////////////////// if (obj.RemoteFlag == 0) { str = "数据: "; byte len = (byte)(obj.DataLen % 9); byte j = 0; if (j < len) str = " " System.Convert.ToString(obj.Data[0], 16); if (j < len) str = " " System.Convert.ToString(obj.Data[1], 16); if (j < len) str = " " System.Convert.ToString(obj.Data[2], 16); if (j < len) str = " " System.Convert.ToString(obj.Data[3], 16); if (j < len) str = " " System.Convert.ToString(obj.Data[4], 16); if (j < len) str = " " System.Convert.ToString(obj.Data[5], 16); if (j < len) str = " " System.Convert.ToString(obj.Data[6], 16); if (j < len) str = " " System.Convert.ToString(obj.Data[7], 16); } listBox_Info.Items.Add(str); listBox_Info.SelectedIndex = listBox_Info.Items.Count - 1; } Marshal.FreeHGlobal(pt); } private void button_StartCAN_Click(object sender, EventArgs e) { if (m_bOpen == 0) return; VCI_StartCAN(m_devtype, m_devind, m_canind); } private void button_StopCAN_Click(object sender, EventArgs e) { if (m_bOpen == 0) return; VCI_ResetCAN(m_devtype, m_devind, m_canind); } unsafe private void button_Send_Click(object sender, EventArgs e) { if(m_bOpen==0) return; VCI_CAN_OBJ sendobj = new VCI_CAN_OBJ(); //sendobj.Init(); sendobj.SendType = (byte)comboBox_SendType.SelectedIndex; sendobj.RemoteFlag = (byte)comboBox_FrameFormat.SelectedIndex; sendobj.ExternFlag = (byte)comboBox_FrameType.SelectedIndex; sendobj.ID = System.Convert.ToUInt32("0x" textBox_ID.Text,16); int len = (textBox_Data.Text.Length 1) / 3; sendobj.DataLen =System.Convert.ToByte(len); String strdata = textBox_Data.Text; int i=-1; if(i <len-1) sendobj.Data[0]=System.Convert.ToByte("0x" strdata.Substring(i * 3, 2),16); if (i < len - 1) sendobj.Data[1]=System.Convert.ToByte("0x" strdata.Substring(i * 3, 2),16); if (i < len - 1) sendobj.Data[2]=System.Convert.ToByte("0x" strdata.Substring(i * 3, 2),16); if (i < len - 1) sendobj.Data[3]=System.Convert.ToByte("0x" strdata.Substring(i * 3, 2),16); if (i < len - 1) sendobj.Data[4]=System.Convert.ToByte("0x" strdata.Substring(i * 3, 2),16); if (i < len - 1) sendobj.Data[5]=System.Convert.ToByte("0x" strdata.Substring(i * 3, 2),16); if (i < len - 1) sendobj.Data[6]=System.Convert.ToByte("0x" strdata.Substring(i * 3, 2),16); if (i < len - 1) sendobj.Data[7] = System.Convert.ToByte("0x" strdata.Substring(i * 3, 2), 16); int nTimeOut= 3000; VCI_SetReference(m_devtype, m_devind, m_canind, 4, (byte*)&nTimeOut); if(VCI_Transmit(m_devtype,m_devind,m_canind,ref sendobj,1)==0) { MessageBox.Show("发送失败", "错误", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } private void comboBox_devtype_SelectedIndexChanged(object sender, EventArgs e) { } private void comboBox_DevIndex_SelectedIndexChanged(object sender, EventArgs e) { } } }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论