CAPL 脚本下调用cmd 和其它应用程序

📙 相关文章

在这里插入图片描述


📘前言

  • 🍅 CAPL脚本中插入cmd指令和调用第三方程序
  • 🍅演示软硬件环境 Win10 x64 ; CANoe 11 SP2 x64

请添加图片描述

📙 sysExecCmd 调用cmd指令

  • 🍅如下图help文档给出的解释,调用cmd 给了4中类型,接下来我们逐个解读下

在这里插入图片描述

🍅 参数char cmd[]

  • 1️⃣ 先不管 参数 char params[], 和char directory[] ,先看参数char cmd[],
  • 下面代码,直接什么都不写,直接调用sysExecCmd
On key 'a'
{
  sysExecCmd("", "" );
}

  • 2️⃣ 输出结果可以看出,直接打开了cmd 控制台,而且根目录是当前打开的cfg所在的根目录
    在这里插入图片描述

  • 3️⃣ 我们用cd 指令进入到指定的路径下。
on key 'b'
{
  char cmd[255];
  char basePath[1024] = "D:\\CANoe-Demo\\TestModule\\callCMD";
  snprintf(cmd,elCount(cmd),"cd %s",basePath);
  sysExecCmd(cmd, "" );
}

  • 4️⃣ 输出结果可以看出,正确执行了我们的cd 指令

在这里插入图片描述


🍅 参数char params[]

  • 1️⃣ 了解了char cmd[], 我们再看参数 char params[] ,因为有些cmd指令是有参数的,这里我们可以在第二个参数中写如cmd的参数
on key 'c'  
{
  sysExecCmd("dir", "" );
}
on key 'd'  
{
  sysExecCmd("dir", "/w" );
}

  • 2️⃣ 输出结果可以看出 ,参数设置生效了。

在这里插入图片描述


  • 3️⃣ 参数直接在cmd参数里面写入效果也是一样的。
on key 'e'  
{
  sysExecCmd("dir /w", "" );
}

🍅 参数char directory[]

  • 1️⃣ 了解了char cmd[], 参数 char params[] ,我们再看下参数char directory[]
  • 没这个参数,cmd 默认进入打开的cfg文件所在的目录,有这个参数,cmd将进入 指定的路径下
on key 'g'  
{
  char basePath[1024] = "D:\\CANoe-Demo\\TestModule\\callCMD";
  sysExecCmd("dir /w", "",basePath );
}

  • 2️⃣ 输出结果可以看出 ,参数设置生效了。

在这里插入图片描述


🍅 自动关闭cmd控制台

  • 1️⃣ 上面调用cmd 控制台后,如果你不关闭,他是不会关闭,最好就是执行完功能后给它自动关闭掉
  • 比如,我们在写脚本中,可能想临时创建个文件或者有时候要把某个文件的只读属性给去除,这个时候才CAPL脚本中插入一行 sysExecCmd 就很方便
  • & exit 可以运行完指令后再退出
on key 'h'  
{
  char basePath[1024] = "D:\\CANoe-Demo\\TestModule\\callCMD";
  sysExecCmd("echo hello > a.txt & exit", "",basePath );
}

  • 2️⃣ 运行完毕后,你会发现cmd一闪而过,而指令也已经完成了

在这里插入图片描述


📙 sysExecCmd 调用可执行程序

🍅 调用bat 文件

  • 1️⃣ 上面我们用cmd的复合指令完成了创建a.txt文件,毕竟cmd指令无法完成更加复杂的指令,我们可以在bat文件中,完善代码,然后再取调用它
    在这里插入图片描述

  • 2️⃣ CAPL脚本如下,运行下可以得到b.txt文件被创建了:
on key 'j'  
{
  char basePath[1024] = "D:\\CANoe-Demo\\TestModule\\callCMD";
  sysExecCmd("callBat.bat", "",basePath );
}

🍅 调用python 文件 (带参数)

  • 1️⃣ 下面我们调用下python脚本,并传递三个参数
on key 'k'  
{
  char basePath[1024] = "D:\\CANoe-Demo\\TestModule\\callCMD";
  sysExecCmd("python callPython.py", "100 200 300", basePath);
}

  • 2️⃣ 执行结果如下:

  • 在这里插入图片描述

在这里插入图片描述


🍅 调用其它exe程序

  • 1️⃣ 下面脚本可以让我们直接打开计算器
on key 'l'  
{
  sysExecCmd("calc & exit", "");
}

📙 sysExec

  • 1️⃣ 这个格式cmd参数传递的必须是个可执行程序,不是能dos 指令
  • 可以执行下,下面两种方式的差别:
  • sysExecCmd 会打开cmd 控制台
  • sysExec 不会打开控制台 或者打开控制台自动关闭
on key 'l'  
{
  sysExecCmd("calc & exit", "");
}

on key 'z'  
{
  sysExec("calc", "");
}

  • 2️⃣ 下面我们通过调用下callBat2.bat脚本,来看下sysExec究竟和sysExecmd 还有什么区别
on key 'v'  
{
  long retVal;
  char basePath[1024] = "D:\\CANoe-Demo\\TestModule\\callCMD";
  retVal = sysExec("callBat2.bat", "",basePath );
  write("retVal:%d",retVal);
}

  • 返回值居然是0;用 sysExecmd可以正常执行的用 sysExec却不行了?

在这里插入图片描述

  • 3️⃣ cmd 参数必须是绝对路径,相对路劲都不行
on key 'n'  
{
  long retVal;
  char basePath[1024] = "D:\\CANoe-Demo\\TestModule\\callCMD";
  retVal = sysExec("D:\\CANoe-Demo\\TestModule\\callCMD\\callBat2.bat", "",basePath );
  write("retVal:%d",retVal);
}

  • 运行结果如下图,在 D:\\CANoe-Demo\\TestModule\\callCMD路径下创建了c.txt ,如果改成 retVal = sysExec("D:\\CANoe-Demo\\TestModule\\callCMD\\callBat2.bat", "" ); 创建文件的路径还相同吗?有兴趣的可以自己试试。

在这里插入图片描述


  • 4️⃣ 奇怪是真的奇怪,如果没有char directory[]) ,那么又可以用相对路径了
  • 下面代码,执行成功了,并在D:\\CANoe-Demo 路径也就是cfg所在目录下创建了c.txt
on key 'm'  
{
  long retVal;
  retVal = sysExec(".\\TestModule\\callCMD\\callBat2.bat", "" );
  write("retVal:%d",retVal);
}

23

🌎总结

请添加图片描述

✂️ 经过上面的尝试,如果想在capl中调用exe 或者执行dos 指令 ,博主建议使用sysExecCmd格式

✂️ 也可通过关注下方的公众号免费领取上面的源码,CANoe软件ISO标准学习资料等海量资源👇

7

  • 🚩要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!

  • 🚩 有手机的小伙伴可以加下交流群,在车载诊断领域的一个小小圈子,群里有网盘资料源码,可能有你需要的呢,平时可以交流技术,聊聊工作机会啥的。

  • 🚩如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。
    18
### 回答1: CAPL (CAN Automation Programming Language) 是一种用于控制和测试汽车网络通信的脚本语言。您可以使用CAPL脚本编写一个校验和程序来校验CAN帧的数据完整性。 下面是一个简单的CAPL程序,用于计算和校验CAN帧的校验和: ``` on message { unsigned char checksum = 0; unsigned int i; //计算校验和 for (i = 0; i < dlc; i++) checksum += data[i]; //如果校验和不正确,则打印错误信息 if (checksum != 0) printf("Error: Checksum is incorrect\n"); else printf("Checksum is correct\n"); } ``` 请注意,以上代码仅提供一个简单的校验和示例,实际上不同的协议可能需要使用不同的校验方法。 ### 回答2: 使用CAPL脚本编写一个checksum校验程序可以按照以下步骤进行: 1. 首先,我们需要定义一个函数来计算数据的checksum值。可以使用常见的校验算法,如异或校验或CRC校验。 2. 创建一个函数,用于接收数据,并调用checksum函数来计算checksum值,并将其与接收的校验和进行比较。校验和可以是发送数据中的预留字段。 3. 如果计算得到的校验和与接收到的校验和相匹配,那么数据是完整的且没有被篡改。可以输出一个成功的校验消息。 4. 如果校验和不匹配,表明数据被篡改或传输错误。可以输出一个失败的校验消息,并采取相应的处理措施,如重新发送数据或记录错误。 下面是一个示例程序: ``` includes { // 包含所需的库 #include "can_drv.h" } variables { // 定义变量 dword calculatedChecksum = 0; dword receivedChecksum = 0; dword dataLength = 0; } on receive CAN_MESSAGE { // 接收到CAN消息时执行 dataLength = this.DLC; // 获取消息的数据长度 receivedChecksum = this.DataByte(dataLength - 1); // 获取接收到的校验和 // 计算校验和 for (int i = 0; i < dataLength - 1; i++) { calculatedChecksum ^= this.DataByte(i); // 使用异或校验算法 } // 比较计算得到的校验和和接收到的校验和 if (calculatedChecksum == receivedChecksum) { output("校验成功,数据完整。"); } else { output("校验失败,数据可能被篡改或传输错误。"); // 可以在此处进行处理措施,如重新发送数据或记录错误 } } ``` 在以上程序中,我们首先定义了一个接收CAN消息的事件处理程序。在该事件处理程序中,我们获取接收到的数据的长度和校验和。然后,我们使用异或校验算法计算数据的校验和,并将其与接收到的校验和进行比较。如果校验和匹配,则输出一个成功的校验消息;如果校验和不匹配,则输出一个失败的校验消息,并可以进行相应的处理措施。 请注意,以上示例仅演示了如何使用异或校验算法进行校验。根据实际需要,您可以根据数据的特点选择合适的校验算法。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蚂蚁小兵

慢慢长夜磨一章好文章,费烟!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值