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时是扩展帧
原文地址:https://www.cnblogs.com/fuhang/p/7855791.html