2. 发送单帧CAN消息
任务目标
在CANalyzer中通过CAPL程序创建并发送一条标准CAN消息:ID为0x123,包含8个数据字节,以100ms为周期循环发送。本案例聚焦于CAPL中最基础的报文发送机制,不涉及网关、诊断或复杂信号处理。
实现方案
使用CAPL的on timer事件配合message对象实现周期发送。核心思路:在on start中启动定时器,定时器到期后填充消息数据并调用output()函数将报文发送到CAN总线上,随后重新启动定时器形成周期循环。
完整代码
/* 全局消息对象定义 */
message 0x123 msg; // 标准ID,默认8字节数据
/* 定时器声明 */
timer tPeriod;
/* 系统启动时初始化 */
on start()
{
// 设置消息数据(示例:递增计数)
msg.byte(0) = 0xAA;
msg.byte(1) = 0x55;
msg.byte(2) = 0x01;
msg.byte(3) = 0x02;
msg.byte(4) = 0x03;
msg.byte(5) = 0x04;
msg.byte(6) = 0x05;
msg.byte(7) = 0x06;
// 启动周期定时器(100ms)
setTimer(tPeriod, 100);
}
/* 定时器到期处理 */
on timer tPeriod
{
// 发送消息到总线
output(msg);
// 重新启动定时器,实现周期发送
setTimer(tPeriod, 100);
}
/* 可选:按键手动触发一次发送(用于验证) */
on key 's'
{
output(msg);
write("手动发送: ID=0x%X", msg.id);
}
运行与验证
环境要求:CANalyzer(建议8.5及以上版本),需配置至少一个CAN通道(如CAN1),并确保该通道连接至总线或使用CANalyzer内置的总线关闭模拟功能。
操作步骤:
- 在CANalyzer中新建工程,添加一个CAPL程序节点(右击Simulation Setup中的节点 → Insert CAPL Program)。
- 将上述代码粘贴至CAPL Browser中,编译(F7)确保无错误。
- 在Simulation Setup中,将CAPL节点分配至可用的CAN通道(如CAN1)。
- 点击工具栏的Online按钮(或按F9)进入在线模式,程序自动执行
on start,开始周期发送。
验证方法:
- 打开Trace窗口,观察是否每100ms出现一条ID为
0x123的报文。 - 点击Trace窗口中的报文,在Frame View中检查Data字段是否为
AA 55 01 02 03 04 05 06。 - 按键盘字母s键,Trace窗口应立即新增一条相同ID的报文,证明手动触发功能正常。
通过条件:Trace窗口在1秒内应显示约10条ID为0x123的报文(允许±1条误差),且数据字节与代码设置一致。若使用总线模拟环境,可通过CAN Statistics窗口查看Tx帧计数持续递增。
常见问题
- 报文未发送:检查CAPL节点是否已分配至有效通道,且通道处于Online状态。
- 周期不准确:定时器最小精度受系统影响,若需更高精度可使用
setTimerCyclic替代手动重启定时器。 - ID显示为扩展帧:确认消息定义未使用
extended关键字,标准ID范围0x000~0x7FF。