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時是擴展幀