3. 接收并解析CAN消息
任务目标
编写CAPL程序,在CANalyzer中接收ID为0x456的CAN消息,解析其8个数据字节,并将解析结果打印到输出窗口(Write窗口)。
实现思路
通过CAPL的on message事件处理器捕获指定ID的消息。在事件处理函数中,使用this.byte()方法逐字节读取数据,并通过write()函数输出解析结果。该程序无需额外依赖,直接在CANalyzer的CAPL Browser中编写并关联到Measurement Setup即可运行。
完整代码
<code>/*@!Encoding:1252*/
variables
{
// 可在此定义全局变量(本例无需)
}
// 接收ID = 0x456的消息
on message 0x456
{
int i;
char msgInfo[256];
char byteStr[16];
// 组装消息基本信息
snprintf(msgInfo, elcount(msgInfo), "收到消息 ID=0x%03X DLC=%d", this.id, this.dlc);
write("%s", msgInfo);
// 逐字节解析并打印数据
for (i = 0; i < this.dlc; i++)
{
snprintf(byteStr, elcount(byteStr), " Byte[%d] = 0x%02X", i, this.byte(i));
write("%s", byteStr);
}
// 若DLC小于8,补充提示
if (this.dlc < 8)
{
write(" 注意:DLC=%d,不足8字节", this.dlc);
}
}
运行步骤
- 打开CANalyzer,创建或打开一个工程。
- 在Measurement Setup中插入一个CAPL Program节点,双击打开CAPL Browser。
- 将上述代码粘贴到CAPL Browser中,点击Compile按钮(或按F5)编译,确保无错误。
- 关闭CAPL Browser,激活CAPL Program节点(勾选或点击Online)。
- 启动Measurement(按F9或点击Start按钮)。
- 使用IG(Interaction Generator)或CANoe/CANalyzer的发送功能,向总线发送一条ID=0x456、DLC=8的消息,例如数据为
01 02 03 04 05 06 07 08。
验证方法
观察Write窗口(输出窗口),应看到类似以下输出:
收到消息 ID=0x456 DLC=8
Byte[0] = 0x01
Byte[1] = 0x02
Byte[2] = 0x03
Byte[3] = 0x04
Byte[4] = 0x05
Byte[5] = 0x06
Byte[6] = 0x07
Byte[7] = 0x08
若发送的DLC小于8(例如只发送3个字节),程序会额外打印提示信息。输出内容与发送数据一致,即表示接收与解析功能正常。
常见问题
- 编译错误:确认代码中无中文字符(注释除外),且
elcount函数在CANalyzer 8.0以上版本可用。 - 收不到消息:检查总线仿真是否开启、CAPL节点是否激活、消息ID是否为扩展帧(0x456为标准帧ID,若发送扩展帧需用
on message 0x18x456语法)。 - 输出乱码:Write窗口默认支持ASCII,若需显示中文请调整编码设置。