/// <summary> /// 设置ID过滤,若不需要过滤,则无需使用设置此函数,使用不安全代码,返回0表示OK /// </summary> /// <param name="filterMode"></param> /// <param name="startId"></param> /// <param name="endId"></param> /// <returns></returns> unsafe private bool SetCanIndexFilter(uint canIndex) { UInt32 filterMode = 2; //禁用过滤 UInt32 startId = 0x01; //起始id UInt32 endId = 0xff; //结束id if (filterMode == 2) //不设置滤波 { return(true); } bool result = true; VCI_FILTER_RECORD filterRecord = new VCI_FILTER_RECORD(); filterRecord.ExtFrame = filterMode; //0标准帧滤波,1扩展帧滤波 filterRecord.Start = startId; filterRecord.End = endId; //填充滤波表格 if (VCI_SetReference((uint)m_CanType, m_DeviceIndex, canIndex, 1, (byte *)&filterRecord) == 0) { result = false; return(result); } //按照表格设置滤波 if (VCI_SetReference((uint)m_CanType, m_DeviceIndex, canIndex, 2, null) == 0) { result = false; return(result); } return(result); }
/// <summary> /// 启动CAN的端口号 /// </summary> /// <param name="id"></param> unsafe public Int16 CAN_Open(UInt32 id) { if (ConnectStatus == 0 || 1 == OpenStatus) { return(-1); } //USB-E-U 代码 UInt32 baud = GCanBrTab[2]; if (VCI_SetReference(m_devtype, m_devind, id, 0, (byte *)&baud) != STATUS_OK) { MessageBox.Show("设置波特率错误,打开设备0失败!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); VCI_CloseDevice(m_devtype, m_devind); return(-1); } //滤波设置 ////////////////////////////////////////////////////////////////////////// VCI_INIT_CONFIG config = new VCI_INIT_CONFIG(); config.AccCode = 00000000; // System.Convert.ToUInt32("0x" + textBox_AccCode.Text, 16); config.AccMask = 0xFFFFFFFF; // System.Convert.ToUInt32("0x" + textBox_AccMask.Text, 16); config.Timing0 = 0; // System.Convert.ToByte("0x" + textBox_Time0.Text, 16); config.Timing1 = 14; // System.Convert.ToByte("0x" + textBox_Time1.Text, 16); config.Filter = 1; // 单滤波 (Byte)comboBox_Filter.SelectedIndex; config.Mode = 0; //正常模式 (Byte)comboBox_Mode.SelectedIndex; VCI_InitCAN(m_devtype, m_devind, id, ref config); ////////////////////////////////////////////////////////////////////////// Int32 filterMode = 2; // comboBox_e_u_Filter.SelectedIndex; if (2 != filterMode) //不是禁用 { VCI_FILTER_RECORD filterRecord = new VCI_FILTER_RECORD(); filterRecord.ExtFrame = (UInt32)filterMode; filterRecord.Start = 1; // System.Convert.ToUInt32("0x" + textBox_e_u_startid.Text, 16); filterRecord.End = 0xff; // System.Convert.ToUInt32("0x" + textBox_e_u_endid.Text, 16); //填充滤波表格 VCI_SetReference(m_devtype, m_devind, id, 1, (byte *)&filterRecord); //使滤波表格生效 byte tm = 0; if (VCI_SetReference(m_devtype, m_devind, id, 2, &tm) != STATUS_OK) { MessageBox.Show("设置滤波失败", "错误", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); VCI_CloseDevice(m_devtype, m_devind); return(-1); } } VCI_StartCAN(m_devtype, m_devind, id); return(0); }
unsafe private void buttonConnect_Click(object sender, EventArgs e) { if (m_bOpen == 1) { VCI_CloseDevice(m_devtype, m_devind); m_bOpen = 0; } else { 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; }