实例介绍
【实例简介】
【实例截图】
【核心代码】
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小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论