CAN通信要注意的問題


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM