• 132查看
  • 0回复

[底层软件] 汽车电子底层软件中的数据编码

[复制链接]

该用户从未签到

发表于 28-4-2024 19:50:21 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


前言

前几天,同事问了我一个问题:“0xD+0x30为什么等于0x44”。我大脑迅速飞转,仍然想不通为什么等于0x44。然后问清了事情的来龙去脉,原来是在测试DID(数据标识符,诊断服务UDS中的一个概念),瞬间明白了这个问题涉及到汽车电子底层软件中的数据编码格式。

在汽车电子底层软件中,尤其是UDS诊断相关的数据,一定要特别注意数据的编码格式,让我们一起来盘点一下汽车电子底层软件中的数据编码格式。

数据的编码格式

数据编码格式的基础问题

一个数据“80”是什么意思?如果按照十六进制去理解这个数据,那就是0x80。如果按照10进制去理解这个数据,那就是八十。如果按照8进制去理解这个数据,那么这是一个错误的数据,因为8进制的数据最大不超过8。

我们继续分析这个数据,如果这个数据就是十六进制的80,即0x80,当然也可以是0x0080,0x00000080,显示的时候,可能会把高位的0给去除。我们继续分析,按照uint8_t的数据类型去解析这个数据,即值为十进制128,按照int8_t解析这个数据,值为-128。如果我们继续按照uint16_t,int16_t,uint32_t,int32_t,uint64_t,int64_t去解析这个数据,值均为十进制128。如果按照float去解析这个数据,根据IEEE 754标准,值约为1.19209290e-07f。如果按照double类型去解析这个数据,根据IEEE 754标准,值约为1.19209290e-07f。

这里涉及到多个概念,如下所示:

    屏幕显示值(80),在很多调试器中可以自由切换16进制、十进制、8进制显示,一般16进制显示的值为该数据的机器码。

    机器码:以机器语言的形式存储在计算机内存中的二进制代码,一般以16进制形式存在解析。

    机器码的大小端:分为大端和小端格式。大小端(Endian)是计算机系统中数据存储的一种字节序方式,它决定了多字节数据在内存中的存储顺序。具体来说,大端模式(Big-Endian)将高位字节存储在内存的低地址处,而低位字节存储在内存的高地址处;而小端模式(Little-Endian)则将低位字节存储在内存的低地址处,高位字节存储在内存的高地址处。

    这种差异在处理多字节数据类型(如整数、浮点数等)时非常重要,因为不同的字节序方式会导致数据在内存中的表示方式不同,从而影响数据的读取和解释。例如,一个16位的整数0x1234在大端模式下的存储顺序为0x12 0x34,而在小端模式下则为0x34 0x12。

    在计算机系统中,不同的CPU架构和操作系统可能采用不同的字节序方式。例如,x86和x86_64架构的CPU采用小端模式,而Motorola和IBM的PowerPC架构则采用大端模式。因此,在跨平台编程和数据处理时,需要注意字节序的问题,以确保数据的正确性和兼容性。

    数据类型:例如char ,int8_t, uint8_t ,int16_t,uint16_t,int32_t,uint32_t,int64_t,uint64_t,float,double。

对于机器码的使用,尤其是在诊断功能中的冻结帧功能开发时尤其重要,我们经常碰到一个数据类型是浮点型,当我们使用

float a;uint32_t data = (uint32_t)(a);

表达式进行强转时,会丢失小数点后的精度,这就可能导致在控制器出现故障时,获取到的数据无法正常得到精准的数据。

因此,应该用如下表达式进行转换,当我们获取到机器码时,再按照IEEE 754标准进行反向转换得到浮点数。

uint32_t data = (uint32_t)(*((uint32_t*)&a));

这段表达式的意思是:我们先把变量a的地址取出来,按照uint32_t*去解析这段地址的数据,然后再引用获取地址里的数据,就可以获得到变量a的机器码了,本质上十六进制的数据和机器码是一回事。当我们用诊断仪读取到这段数据时,把这个数据重新拼接,按照float类型去解析即可得到最终真实的数据。

更“高级”的编码格式

在汽车电子软件中,还有其他格式编码格式,比如说ASCII码,BCD码,Unicode编码格式, Base64编码格式等等。

    ASCII码:(American Standard Code for Information Interchange,美国信息交换标准代码),是一种基于拉丁字母的字符编码,最初设计用来处理英语字符,包括大小写字母、数字、标点符号和一些特殊控制字符。它使用7位二进制数表示128个不同的字符。此处就不贴ASCII码表了,有兴趣的可以自行搜索。ASCII码在汽车电子诊断软件中常常以软件版本号的形式存在。

    BCD码:(Binary Coded Decimal)BCD编码是用多位二进制数表示一位十进制数的方法,例如用四位二进制数来表示一个0-9之间的十进制数。也就是说诊断仪读出来0x80,实际上代表十进制的80。在诊断软件开发过程中,BCD码也是常用的编码格式。主要是为了诊断仪的显示和输出。

    Unicode编码:Unicode是为了统一全球所有语言和符号而创建的一种字符集,可以包含世界上几乎所有的书面文字。常见的Unicode编码格式有:UTF-8:可变长度编码,对英文字符占用1个字节,对于其他字符最多占用4个字节。UTF-16:固定或可变长度编码,通常以两个字节为单位存储大多数字符,对于某些高码位字符可能需要四个字节。

    在汽车电子底层软件中,我们经常用python写各种脚本,有时候,我们会在python文件的上方有一句注释UTF-8。

    Base64编码:Base64是一种将任意二进制数据转换成仅包含64种字符(A-Za-z0-9+/)的文本格式的编码方式。在汽车电子底层软件中,密码学(信息安全)开发中的证书一般就是Base64编码格式的。

    URL编码(Percent Encoding):在HTTP协议中,非字母数字字符在URL中通过百分号“%”后跟两位十六进制数进行转义,确保URL中的特殊字符能被正确解析。在汽车电子底层软件FOTA软件中,经常用到URL,方便车和云进行通信。

    JSON编码(JavaScript Object Notation):JSON是一种轻量级的数据交换格式,采用完全独立于语言的文本格式来存储和表示数据,实际上是Unicode编码的文字。在AP Autosar中,用到了很多配置文件就是JSON格式的。

    XML编码(eXtensible Markup Language):XML是一种标记语言,用于文档的结构化描述与数据交换,它本身不规定字符编码,但推荐使用UTF-8。Autosar标准的配置文件是ARXML,本质上就是XML编码。

    A2L编码:一种标准化的数据描述格式,用于描述电子控制单元(ECU)内部的测量和校准数据。A2L是ASAP2 (A Measurement and Calibration Data Description Language) 的一种实现,由ASAM (Association for Standardization of Automation and Measuring Systems) 组织制定。A2L中有一个重要的点需特别注意:即物理单位和转换公式:定义了如何将二进制数据转换为有意义的物理量,如转速、温度或压力,并指定了相应的单位。因此,在上位机一般是INCA或者CANape中,一般会显示物理值,但是切换成HEX值之后,很多时候是无法和物理值对起来,物理单位和转换公式在此处起到作用。



汽车电子底层软件的数据编码示例

    诊断仪读出数据“0x20 0x22 0x01 0x30”,实际表示2022年1月30日,采用BCD编码。

    诊断仪读出数据“0x00,0x00,0x00,0x53,0x57,0x30,0x31”,实际表示“   SW01”,这是一个软件版本号,采用ASCII码。需要特别注意,软件版本号采用右对齐还是左对齐,对齐部分使用ASCII码空格补齐。

    诊断仪读出据“0x40,0x72,0xC0,0x5F,0x6F,0xD2,0x1F,0xF3”,假设这个数据是19服务读到的冻结帧数据,代码编写时,原始数据类型为浮点型,按照IEEE754标准,解析之后真实数据为300.0233,假设这是一个电机转速值,则解析出的数据为300.0233转/秒。

    使用诊断仪将如下证书写入控制器,传输时,还是以二进制的形式存在的。这是BASE64编码格式。

汽车电子底层软件中的数据编码w1.jpg

总结

汽车电子底层软件中的数据编码在诊断数据,文件输入,文件配置等方方面面均存在。尤其是在诊断数据中,一般以十六进制的形式存在,在十六进制和实际值之间存在一定的转换关系,这就是数据编码的意义所在。但是一定要特别注意,在文档中需要做好这种转换关系的定义的描述,方便存档和后续的数据解析。

参考链接

    https://zhuanlan.zhihu.com/p/658898665

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 13-5-2024 14:37 , Processed in 0.215500 second(s), 30 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.