周立功CAN卡C#二次开发心得

  • 二次开发说明
  • 1、整体说明
  • 2、二次开发之解析CAN报文
  • 2.1解析状态值
  • 2.1.1 筛选ID
  • 2.1.2 解析状字节、位的状态值
  • 2.1.3 示例代码
  • 2.1解析数值值
  • 2.2.1 筛选ID
  • 2.2.2 解析值
  • 2.2.3 示例代码


二次开发说明

最近自学C#,且工作有涉及CAN,就从周立功官网下载了二次开发文档、C#案例。进行改造,以下是相关心得

1、整体说明

周立功官网提供各种开发环境的案例,如c++、c#,已经写好了初始化的的各种流程,如果不是二次开发高级的应用,直接在“timer_rec_Tick”方法的最后插入自己的二次开发函数。
备注:timer_rec_Tick函数就是设置一个定时器,每隔一定时间来处理相关的函数,比如每隔一段时间从“VCI_Receive”处理接收的CAN数据)

2、二次开发之解析CAN报文

解析CAN报文,指根据CAN协议的某一ID的定义来解析相关参数,比如根据报文来实时解析车速,查看某个状态值如左前门是否打开。
所要做的就是在周立功官网给的案例的VCI_Receive的VCI_Receive的最后插入二次开发的自定义函数CanTranslateTxt(obj.ID,obj.Data),解析ID(obj.ID)和对应的数据(obj.Data)。即每隔一定时间解析“VCI_Receive”函数传递的"VCI_CAN_OBJ "中的CAN 帧结构体中的ID和数据。

unsafe private void timer_rec_Tick(object sender, EventArgs e)
        {
            #region 官网代码已省略
            //.......官网代码已省略
            #endregion
                //
                //二次开发
                //
                CanTranslateTxt(obj.ID,obj.Data);                  //二次开发函数
            }
            Marshal.FreeHGlobal(pt);
        }

2.1解析状态值

状态值是指报文的开关量,比如某个门是否开启,雨刮是否工作。是根据协议ID的某个字节的某个位的不同值来显示对应的状态。

2.1.1 筛选ID

采用 switch cese函数:

switch (_ID)
            {
                case 0xABC:      //ABC为ID    
                     #region 
                     //........插入自定义函数,
                     #endregion
                    break;
                default:
                    break;
            }

2.1.2 解析状字节、位的状态值

根据参数值在CAN协议中的描述,第几字节,第几位,来处理:
如:判断byte1,bit4~3 值是否为0x1函数为:

(Data[1] >> 3 &0x3)==0x1; //  >> 3&0x3为提取出bit4~3的值

2.1.3 示例代码

unsafe public void CanTranslateTxt(uint _ID,byte* Data)
        {
           switch (_ID)
            {
                case 0x10FEF721:          // 0x10FEF721 为要解析的ID                
                    if (((Data[1]>>1)&0x01)==1)    //判断byte1的bit1位的值
                    {
                        textBox3.Text = "打开";
                    }
                    break;
                default:
                    break;
            }
        }

2.1解析数值值

数值值是指某一参数的数值是多少,比如车速是多少、油量是多少。
是根据协议ID的某些字节的某些位的不同值乘上精度再加上偏移计算出值。

2.2.1 筛选ID

采用 switch cese函数:

switch (_ID)
            {
                case 0xABC:      //ABC为ID    
                     #region 
                     //........插入自定义函数,
                     #endregion
                    break;
                default:
                    break;
            }

2.2.2 解析值

根据协议ID的某些字节的某些位的不同值乘上精度再加上偏移计算出值。如CAN协议规定某个参为byte1,精度0.1,偏移10;

Data[1]  * 0.1 +10;

2.2.3 示例代码

switch (_ID)
            {
                case 0x0CFE6C17:            //0x0CFE6C17为要解析的ID
                    textBox4.Text =((Data[6] +Data[7]*256)/256).ToString();          //intel 格式,byte7~6,精度:1/256,偏移:0
                    break;
                default:
                    break;
            }

以上完整原码和周立功官网案例的注释