周立功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;
}
以上完整原码和周立功官网案例的注释