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内置的总线关闭模拟功能。

操作步骤:

  1. 在CANalyzer中新建工程,添加一个CAPL程序节点(右击Simulation Setup中的节点 → Insert CAPL Program)。
  2. 将上述代码粘贴至CAPL Browser中,编译(F7)确保无错误。
  3. 在Simulation Setup中,将CAPL节点分配至可用的CAN通道(如CAN1)。
  4. 点击工具栏的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。