CAN通信要注意的问题主要有:
1.参数配置
在初始化、启动、发送、接收 CAN信息时都要对CAN卡进行参数配置:
(1)CAN卡的选择,我用到的是周立功的PCIE—9221,也就是DevType设备类型的选择。
(2)设备索引号DevIndex,比如只有一个PCIE-9221时。索引号为0,再插入1个时索引号为1。注意如何区分是否为两个CAN卡,有时候一张CAN卡上会有多个CAN接口,此时不能把多个接口看做是多张CAN卡,多个接口是多路CAN。
(3)第几路CAN(CANIndex),对应的是CAN的通道号,CAN0为0,CAN1为1,依次类推。
VCI_OpenDevice(nDeviType,nDeviceInd,nReserved);
VCI_InitCAN(nDeviceType,nDeviceInd,nCANInd,&vic);
2.注意定义初始化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;//模式 }
对定时器的设置就是对波特率的设置,具体设置可对应下表。验收码和屏蔽码可以不设置。
VCI_INIT_CONFIG config = new VCI_INIT_CONFIG(); config.AccCode = System.Convert.ToUInt32("0x" + "00000000", 16); config.AccMask = System.Convert.ToUInt32("0x" + "FFFFFFFF", 16); config.Timing0 = System.Convert.ToByte("0x" + "01", 16); config.Timing1 = System.Convert.ToByte("0x" + "1C", 16); ; config.Filter = 0;// 单滤波 config.Mode = 0;//正常模式
3.注意区分标准帧和扩展帧,数据帧和远程帧,还有发送方式。
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]; } VCI_CAN_OBJ sendobj = new VCI_CAN_OBJ(); sendobj.SendType = System.Convert.ToByte(0);//为0时正常发送,为2时自发自收。 sendobj.RemoteFlag = 0;//为0时是数据帧,为1时是远程帧 sendobj.ExternFlag = 1;//为0时是标准帧,为1时是扩展帧