capl定时器的用法,使用定时器周期发送CAN报文并处理checkSum校验算法

347 阅读1分钟

test.can

定时器一共有两种分别是TimermsTimer分别可以设置秒级和毫秒级的定时器

  • 需求1:定时器周期发送CAN报文
    • 首先创建msTimer定时器对象 MsTime00(根据周期不同可以创建不同的对象,这里创建的是一个100ms周期的定时器)
    • 定义SetSignalValue函数export void SetSignalValue,用于设置CAN信号值
    • 定义定时器函数语法是on timer xxxxxx是上面创建的定时器对象on timer msTime100
    • 启动定时器on key 'a' ,可以看到以100ms为周期,向外发送CAN报文
    • 停止听十七on key 'b' ,可以看到周期发送停止了
// 定时器周期发送CAN报文函数
variables
{
   msTimer msTime100; 
}
on start
{
  write("开始程序");
}
export void SetSignalValue (){
  message * Msg;
  Msg.id = 0x111;
  Msg.dlc= 15;
  Msg.DataLength = 64;
  Msg.FDF = 1;
  Msg.BRS = 1; 
  Msg.byte(0) = 1;  
  Msg.byte(1) = 2; 
  Msg.byte(2) = 3;
  output(Msg); 
}
on timer msTime100
{  
  SetSignalValue();
  setTimer(msTime100,100);
}
on key 'a' 
{
  setTimer(msTime100,10);  //启动定时器
}
on key 'b' 
{
  cancelTimer(msTime100);  //关闭定时器
}
  • 需求2:定时器周期发送CRC8的CAN报文
// 定时器周期发送CAN报文函数
variables
{
   msTimer msTime100; 
}
on start
{
  write("开始程序");
}

export void crc16 (){
  //crc校验算法处理
}

export void SetSignalValue (){
  message * Msg;
  Msg.id = 0x111;
  Msg.dlc= 15;
  Msg.DataLength = 64;
  Msg.FDF = 1;
  Msg.BRS = 1; 
  crc_up, crc_down = crc16(); 
  Msg.byte(0) = crc_up;  
  Msg.byte(1) = crc_dowm; 
  Msg.byte(2) = 3;
  output(Msg); 
}
on timer msTime100
{  
  SetSignalValue();
  setTimer(msTime100,100);
}
on key 'a' 
{
  setTimer(msTime100,10);  //启动定时器
}
on key 'b' 
{
  cancelTimer(msTime100);  //关闭定时器
}