CAPL_构建基于UDS的刷写学习—04 思路的构建_第一部分

news2024/12/28 3:25:12

前言与导读:

基于前几篇文章我们已经梳理了HEX文件、S19文件的读取和UDS关键的0x34/0x36/0x37等服务的结构。

基于此,我们差不多就完成了前期的知识储备了,那么完成最终的目的——使用capl实现我们还需要解决以下几个问题。

1、文件如何读取?

2、文件读取后,常见的hex和S19都是以ASCIL码格式,而我们使用0x36服务发送出去时,是需要发送的是byte类型的十六进制数字,如何将ASCIL码格式的字符转换为byte类型的十六进制数字?

3、类型装换好之后,还需要去判断文件的类型,读取文件中关键的地址信息,数据段开始-结束标志

4、实际项目中,uds刷写是存在一个固定化的流程,如先要进10 03会话,然后使用0x28/0x85等服务关闭通讯和DTC检测,有些主机厂还存在0x31服务等?如何构建发送体系?

5、实际发送过程中,还有可能出现否定响应,当uds刷写的重要步骤,出现否定响应时,就应该退出刷写?这个功能该如何实现?

6、0x36服务,发送大量数据,不可能使用单帧发送完全部数据。还需要使用多帧数据来发送数据。多帧情况下,还需要接收流控帧,根据流控帧的信息决定,接下来是否继续发送。此外多帧中的续帧,序号从0x21-0x2F循环。

7、此外还需要考虑时间参数是否合理,如As、Ar、Ac、Bs。。。P2、P2*,S参数不能出现超时。

小结:故总体看上去,任务是非常多的,而且很多问题都是一环套一环,一个环节出现差错,会导致整体的刷写失败。

但是千里之行,始于足下,逻辑理清了,我们一个一个来攻克

1、文件如何读取?

 1.1)openFileRead 函数

先看官方文档

openFileRead小结:

         1*)存在两种Form;

         2*)两种Form的格式的返回值类型都是dword;

         3*)mode=0,代表打开的是text类型的文件 mode=1,代表打开的是binary(二进制)类型的文件

1.1.1 形参Filename的解释

重点关注图中标注出来的Filename,我们先看官方文档是怎么说的:

标注出来的一段话,意思是Filename(文件名)是通过绝对路径来进行传参,所谓绝对路径,就是指完整的路径。

OpenFileRead ("Data.Txt",0); 如上面一段语句,filename="Data.Txt"只给出了文件名,那么就引出一个问题,就是函数如何如何准确的找到这个函数

接下来这段描述了函数找文件的方法

1:首先在batabase文件所在的文件夹下,寻找需要打开的文件,如果没有找就执行步骤2

2:继续到cfg所在的文件夹下寻找

故:当我们使用openfileread()来打开文件时,是需要手动将需要打开的文件放置到以上两个文件夹中的任意一个。

 1.1.2 形参FileEncoding的解释

这个暂时不是很懂,也没有查到相关比较详细的资料,大多时候是可以不使用的

小结:

故我们写代码时:

*1)先使用OpenFileRead函数打开我们需要读取的Hex文件或S19文件

*2)根据OpenFileRead的返回值还要定义一个dword 类型的变量,通常我们将这个变量称为:“文件句柄”

dword fileHandle;

fileHandle = OpenFileRead("D:\\word\\text_hex",0);   //获取文件句柄,以文本形式打开路径中的文件

拓展延伸:对文档路径的设置方法

大家看我标红的部分,绝对路径,除了上述方法,为了增加代码移植性和可维护性,我们还有两种办法,如下

*1)使用CANoe中的系统变量,和输入框(panel),先在panel中设置一个输入框,再设定一个系统变量 ,将输入框输入的绝对地址和系统变量关联后,在capl代码中将地址赋值给字符串。

代码如下:

char file_path[50]={0};

sysGetVariableString(sysvar::files_space::driverPath,file_path, elCount(file_path)); //获取文件路径

 2*)  使用setFilePath函数设置路径

0

Sets path for read functions(设定只读)

1

Sets path for write functions (same as setWritePath)(设定只写)

2

Sets path for both types of functions(可读可写)

2.1*)setFilePath函数的介绍

setFilePath函数Return Values

无任何返回值

setFilePath函数Example

//set directory for reading
setFilePath("C:\\Windows\\TEMP", 0);
//set directory for writing
setFilePath("D:\\TEMP", 1);
//set directory for writing and reading
setFilePath("C:\\TEMP", 2);

1.2  文件的读取

我们可以使用CAPL自带的函数, Filegetstringsz 来执行读取任务。

1.2.1 首先来看官方文档

       图中从上往下看,我们使用这个函数,可以直接读取一行数据到字符数组中去,但是在调用这个函数前,我们还要定义一个字符数组用来存放我们读取到的这一行字符串。

       还有以下几点需要注意:

(1)字符数组长度的定义,如:char buff_rowdata[Length],Length的长度不能太短,否则是读不到一行里全部的内容的,这里建议大家设置Length=256。这样就能很好的兼容S19和hex文件,而且也不会出现数组截断的情况发生。至于为什么?大家思考一下?

本段小结:代码如下

const word Length=256;

dword FileHandle_1;

char buff_rowdata[Length];

FileHandle_1=OpenFileRead("D:\\word\\text_hex",0);  

Filegetstringsz(buff_rowdata,elcount(buff_rowdata),FileHandle_1);

注意和提示:

这里注意,elcount()函数和strlen()函数的区别:

**1)elcount是可以对所有数组(整形数组,实数数组,字符数组,结构体数组)等所有数组的元素,且这些数组是可以没有初始化的。

**2)strlen只能计算有效的字符长度。

char array_1[100];
  write("elcount计算的长度是%d,strlen计算的是%d",elcount(array_1),strlen(array_1));

输出的结果是:

这样大家就明白了吧!!!

2、文件读取后 ,格式装换的问题

此段可以分为两个部分:

(1)ASCIL码装换位unsigned char类型(等价于CAPL中的Byte)。

(2)需要根据被烧写文档的结构,将ascil码两两为一组,组合转换为unsigned char (等价于CAPL中的Byte)类型,同理这种装换也有两种方法来实现。下文细说。

2.1 ASCIL码装换位unsigned char类型

2.1.1 利用CAPL自带函数进行装换

on key 'H'
{
  byte z1;
  byte z2;
  byte z3;
  byte z4;

 char Arry_1[1]=“F”
  z1 = (byte) atol("200"); //atol函数本身装换的是long,z1是Byte,故前面需添加强制转换
  z2 = (byte) atol("0xFF");
  z3 = (byte) atol("050"); 
  z4 = (byte) atol("200.0");

  z5 = (byte) atol(Arry_1);
 write("z1=%d,z2=%d,z3=%d,z4=%d,z5=%d",z1,z2,z3,z4,z5);
}

write界面查看结果:

Program / Model    z1=200,z2=255,z3=50,z4= 

可以看出以下特征被转换字符

**1)参数只能是字符串,或代表字符串的地址;

**2)  默认被转换的字符,在书写形式上,默认为10进制;

**3)表现形式为16进制的字符串,也能被直接转换,但是必须在字符前添加0x;为2进制的也能直接装换。
 

小结:strtod()、strtol()、strtoll等函数也能实现同样的功能,但是这种自带函数,存在一个很大的弊端,就是我们必须要先将字符串,剪切好,然后在使用转换函数进行装换。

2.1.2 手写代码进行装换

基于上段说CAPL自带函数转换的缺点,我们还能自己手写代码?来将ASCIL字符装换为16进制unsigned char。我也推介大家使用这种方法。思路如下

1:先将单个ASCIL字符转换为16进制数

2:两个装换为16进制的数,通过移位后相加,就得到我们需要的结果

// 将char类型转换为byte类型,char类型是指S19文件中读取到的变量类型,转换为Byte类

// 型,适用于发送!!
byte Type_conversion_char_byte(char buffer_one) //这个buffer_one文件是干嘛用的?,从

//返回值类型可以看出
{
  byte buffer_return;  //此值用来作为返回值!!!
  if(buffer_one<71 && buffer_one>64) //表示buffer_one是A-G大写
  {
    buffer_return=buffer_one-55;  //-55后是将装换后的字符,代表的“字符显示的10进制数”
  }
  else if(buffer_one<58 && buffer_one>47)
  {
    buffer_return=buffer_one-48;
  }
  else if(buffer_one=='S') //为S的时候返回FF,区分s3文件
  {
    buffer_return=0xFF;
  }
  return buffer_return;
}

举实例说明: 

有下面一段S19文件的截图

图中S19数据段的3A该如何转换?

Void OtherFunction(viod) 

{

Type_conversion_char_byte(buff_rowdata[10]); //将字符'3'转换为ETX (End Of Text),

//而EXT,则是对应的数字就是3。

Type_conversion_char_byte(buff_rowdata[11]);

}

这里 我们只完成了第一步,我们现在只是转换成功,现在我们还需要将读取的数据组合成0x36服务能发送的值

//先定义两个变量

byte Data_1=Type_conversion_char_byte(buff_rowdata[10]); 

byte Data_2=Type_conversion_char_byte(buff_rowdata[11]); 

byte Data_For_0x36Trans = Data_1<<4 + Data_2;

如此Data_For_0x36Trans的值就转变为了 0x3A=十进制58,大家自己可以试试

3 文件的识别

3.1 文件类型的识别

这里建议大家,回头S19文件的格式,我们以S类型的文件为例。思路如下

**1)需要判断读取的每一行数据的前两个字符,先确定行的类型 用来判断需要读取那些数据

举例说明:例1:

如上图,如果读取到S0开头的行,就说明了,此行 是标题行,16bit的地址栏是没有用的,不需要读取,数据段都是一些版本信息,供应商标识码等,可以根据特殊要求读取,一般情况下,不需要读取。

举例说明:例2:以下是整个S系列文件所有的类型

 以S系列文件为例:

**  行可以划分为标题行、数据行、统计行、结束行。

**  数据行:目前存在3种,S1、S2、S3。

**  S1、S2、S3 类型的地址字段的长度,分别为2Byte、3Byte、4Byte。

**  S1、S2、S3 对应的结束行,分别为 S9、S8、S7。这也是我们通常所说的S19格式文件、S28文件的来源。

hex文件就不再演示了,主要是要搞懂文件的结构即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2266720.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分布式 IO 模块助力冲压机械臂产线实现智能控制

在当今制造业蓬勃发展的浪潮中&#xff0c;冲压机械臂产线的智能化控制已然成为提升生产效率、保障产品质量以及增强企业竞争力的关键所在。而分布式 IO 模块的应用&#xff0c;正如同为这条产线注入了一股强大的智能动力&#xff0c;开启了全新的高效生产篇章。 传统挑战 冲压…

香橙派5Plus启动报错bug: spinlock bad magic on cpu#6, systemd-udevd/443

一、问题 如图&#xff1a; 接上调试串口&#xff0c;每次启动都会报错。不过使用过程中没有发现有什么影响。 百度查阅&#xff0c;有一位博主提到&#xff0c;但是没有细说解决方案&#xff1a; spinlock变量没有初始化_spinlock bad magic on-CSDN博客https://blog.csdn.n…

Matrix-Breakout 2 Morpheus(找到第一个flag)

第一步 信息收集 (1)寻找靶场真实ip arp-scan -l 靶场真实 ip 为192.168.152.154 (2)探测端口及服务 nmap -p- -sV 192.168.52.135 第二步 开始渗透 (1)访问web服务 http://192.168.152.154and http://192.168.52.135:81 发现 81 端口的页面要登录 我们使用 dirb 扫描…

学习C++:关键字

关键字&#xff1a; 作用&#xff1a;关键字是C预先保留的单词&#xff08;标识符&#xff09; 在定义变量或者常量时候&#xff0c;不要用关键字 不要用关键字给变量或者常量起名称

Android笔记(四十):ViewPager2嵌套RecyclerView滑动冲突进一步解决

背景 ViewPager2内嵌套横向滑动的RecyclerView&#xff0c;会有滑动冲突的情况&#xff0c;引入官方提供的NestedScrollableHost类可以解决冲突问题&#xff0c;但是有一些瑕疵&#xff0c;滑动横向RecyclerView到顶部&#xff0c;按住它不放手继续往左拖再往右拖&#xff0c;这…

【提审】Android包提审报权限问题

问题&#xff1a;华为应用市场审核不通过 平台审核检测详情&#xff1a; 日志&#xff1a; 自检工具&#xff1a;frida-server【Unity&Android】安卓app自测应用隐私相关获取和申请权限_apk 隐私合规 自测-CSDN博客 参考资料&#xff1a;Unity启动时获取了android_id等设…

QtQuick之QML应用程序开:一、使用资源文件以及给应用程序添加图标

开发环境: 1、Qt Creator 14.0.1 2、windows10 先看下面的步骤,不明白再返回来看下面官方指导链接。 先看下面的步骤,不明白再返回来看下面官方指导链接。 先看下面的步骤,不明白再返回来看下面官方指导链接。 --------------------------------------------------------…

Task :prepareKotlinBuildScriptModel UP-TO-DATE,编译卡在这里不动或报错

这里写自定义目录标题 原因方案其他思路 原因 一般来说&#xff0c;当编译到这个task之后&#xff0c;后续是要进行一些资源的下载的&#xff0c;如果你卡在这边不动的话&#xff0c;很有可能就是你的IDE目前没有办法进行下载。 方案 开关一下IDE内部的代理&#xff0c;或者…

webauthn介绍及应用

1、webauthn介绍 官网&#xff1a;https://webauthn.io/ 1.1、什么是webauthn&#xff1f; webauthn即Web Authentication&#xff0c;是一个符合W3C标准的Web认证规范。它通过公私钥加密技术&#xff0c;实现无密码认证&#xff0c;用户仅需通过pin码、指纹、面部识别、usb …

中文学习系统:成本效益分析与系统优化

2.1 SSM框架介绍 本课题程序开发使用到的框架技术&#xff0c;英文名称缩写是SSM&#xff0c;在JavaWeb开发中使用的流行框架有SSH、SSM、SpringMVC等&#xff0c;作为一个课题程序采用SSH框架也可以&#xff0c;SSM框架也可以&#xff0c;SpringMVC也可以。SSH框架是属于重量级…

centos单机部署seata

文章目录 场景分析下载seata包启动 场景 centos7.9 jdk17 安装部署seata 分析 jdk和seata的版本对应关系如图 JDK版本 推荐 Seata 版本 理由 JDK 8 任何 Seata 版本 JDK 8 是 Seata 长期支持的版本&#xff0c;兼容性最好。 JDK 11 Seata 1.2.0 适合需要长期支持且性能较高的应…

若依前端挂Nginx、打包部署运行!!!!

先了解知识&#xff1a; const proxy require(http-proxy-middleware);module.exports { devServer:{host: localhost, //target hostport: 8080,//proxy:{/api:{}},代理器中设置/api,项目中请求路径为/api的替换为targetproxy:{/api:{target: http://192.168.1.30:8085,/…

Vue CLI 3 项目构建

Vue CLI 是一个功能强大、易于使用的工具&#xff0c;可以极大地简化 Vue.js 应用的开发过程。通过快速创建项目、灵活的插件系统和丰富的配置选项&#xff0c;开发者可以更专注于业务逻辑&#xff0c;而不是底层配置。无论是新手还是经验丰富的开发者&#xff0c;Vue CLI 都是…

电脑提示报错NetLoad.dll文件丢失或损坏?是什么原因?

一、NetLoad.dll文件丢失或损坏的根源 程序安装不完整&#xff1a;某些程序在安装过程中可能因为磁盘错误、网络中断或安装程序本身的缺陷&#xff0c;导致NetLoad.dll文件未能正确安装或复制。 恶意软件攻击&#xff1a;病毒、木马等恶意软件可能会篡改或删除系统文件&#x…

SpringBoot(二)—— yaml配置文件

接上篇&#xff0c;我们对SpringBoot有了基本的了解&#xff0c;接下来探究配置文件。 目录 二、配置文件 1. SpringBoot热部署 2. 配置文件 2.1 配置文件的作用 2.2 YAML 配置文件 2.3 YAML 与 XML 比较 3. YAML语法 3.1 键值对 3.2 值的写法 3.3 对象/Map&#x…

基于PyQt5的UI界面开发——多界面切换

介绍 最初&#xff0c;因为课设的缘故&#xff0c;我只是想做一个通过按键进行切面切换而已&#xff0c;但是我看网上资料里面仅是语焉不详&#xff0c;让我困惑的很&#xff0c;但后面我通过摸索才发现这件事实在是太简单了&#xff0c;因此我想要记录下来。 本博客将介绍如…

Virtualbox硬盘扩容

前言 有没有使用虚拟机安装操作系统的时候&#xff0c;虚拟硬盘一开始分配的虚拟硬盘空间不够用&#xff1f;在后期去扩容的伙伴们&#xff0c;下面我看看如何扩容virtualbox的虚拟硬盘&#xff1f; 重新分配虚拟硬盘大小 在virtualbox菜单选择【管理】-【工具】-【虚拟介质…

如何实现 MySQL 的读写分离?

面试题 你们有没有做 MySQL 读写分离&#xff1f;如何实现 MySQL 的读写分离&#xff1f;MySQL 主从复制原理的是啥&#xff1f;如何解决 MySQL 主从同步的延时问题&#xff1f; 面试官心理分析 高并发这个阶段&#xff0c;肯定是需要做读写分离的&#xff0c;啥意思&#x…

路由器的原理

✍作者&#xff1a;柒烨带你飞 &#x1f4aa;格言&#xff1a;生活的情况越艰难&#xff0c;我越感到自己更坚强&#xff1b;我这个人走得很慢&#xff0c;但我从不后退。 &#x1f4dc;系列专栏&#xff1a;网路安全入门系列 目录 路由器的原理一&#xff0c;路由器基础及相关…

学习C++:标识符命名规则

标识符命名规则&#xff1a; 作用&#xff1a;C规定给标识符&#xff08;变量、常量&#xff09;命名时&#xff0c;有一套自己的规则 标识符不能是关键字 标识符只能由字母、数字、下划线组成 第一个字符必须为字母或下划线 标识符中字母区分大小写 &#xff08;给标识符命…