• 623查看
  • 0回复

[应用层软件] 工程问题——signed类型报文处理

[复制链接]

  • TA的每日心情
    无聊
    1-7-2015 18:46
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 21-1-2024 13:08:23 | 显示全部楼层 |阅读模式

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


    01

    工程背景

    一般在dbc文件中,通过factor和offset将总线值转换成实际使用的物理值,并且遵循以下公式:

    physical_value = raw_value * factor + offsetraw_value =(physical_value - offset)/ factor
    不过也有例外,如果使用Signed类型的信号数据类型,则不需要offset也可以去表示如图所示的范围[-327.68,327.67]:

    工程问题——signed类型报文处理w1.jpg

    02

    负数的C语言解析   

    那么我们怎么去解析总线上的有符号数呢?

    咱们就需要了解一下 源码、补码、反码这些知识了。

    源码:它直接将一个数(包括正负数)转换成二进制形式,并且最高位用作符号位,0代表正数,1代表负数。

    反码:正数的反码与原码相同;负数的反码则是除了符号位不变外,其他各位都要按位取反,即将“0”变为“1”,“1”变为“0”。

    补码:正数的补码同样与原码相同;负数的补码则是在其反码的基础上加1,也就是对负数的反码进行逐位求和直到产生进位为止。

    那么,相应对应正负数:

    1

    正数

    正数的源码等于补码。

    如:+5的补码仍为00000101;

    2

    负数

    原码求补码,符号位不变,数值位取反再加一。

    -5的补码怎么去求呢,

    先计算-5的反码为11111010,再加1,补码为11111011。

    对应Autosar的信号接收函数:

    工程问题——signed类型报文处理w2.jpg

    工程问题——signed类型报文处理w3.jpg

    然后我们做测试,使用CAN工具发送-100,

    工程问题——signed类型报文处理w4.jpg

    工程问题——signed类型报文处理w5.jpg

    可以看到,我们将总线上发出的0xD8F0,即将总线上的补码解析成我们需要的源码-10000,之后乘以精度得到我们需要的物理值了。

    03

    开个小玩笑   

    是不是觉得好像上面说的还真有点道理?

    其实咱们在接收报文直接使用int类型去接收总线值即可,不需要自己去转换
    工程问题——signed类型报文处理w6.png

    工程问题——signed类型报文处理w7.jpg

    工程问题——signed类型报文处理w8.jpg

    周末快乐~
    工程问题——signed类型报文处理w9.png
    

    该用户从未签到

    发表于 15-3-2025 09:47:01 | 显示全部楼层
    针对您提到的工程问题,关于signed类型报文处理,我作为汽车工程师回复如下:

    在处理signed类型报文时,确实需要考虑到源码、补码和反码的知识。在DBC文件中,通常通过factor和offset转换总线值为物理值,但对于signed类型信号,由于要表示正负范围,无需使用offset。具体解析时,应了解计算机如何表示负数,即使用补码形式。在C语言中,可以直接按位读取总线上的数据,根据数据位模式判断正负,进而得到实际物理值。

    以上是对signed类型报文处理的简要说明,在实际工程中还需结合具体协议和硬件环境进行处理。
    回复 支持 反对

    使用道具 举报

    

    该用户从未签到

    发表于 15-3-2025 09:47:01 | 显示全部楼层
    针对您提到的工程问题,关于signed类型报文处理,我作为汽车工程师回复如下:

    在处理signed类型报文时,确实需要考虑到源码、补码和反码的知识。在DBC文件中,通常通过factor和offset转换总线值为物理值,但对于signed类型信号,由于其能表示正负范围,故无需offset参与转换。在C语言中解析负数时,要了解计算机中数的表示方法,特别是补码形式。对于总线上的有符号数,我们需要按照二进制补码的方式解析,将其转换为实际的数值。在处理过程中,还需考虑到信号的位宽,以确保解析的准确性。

    以上是对您问题的初步解答,如需更详细的技术细节,请继续提问。
    回复 支持 反对

    使用道具 举报

    

    该用户从未签到

    发表于 15-3-2025 09:47:02 | 显示全部楼层
    工程回复:关于Signed类型报文处理

    针对signed类型报文处理,我们需深入理解源码、补码与反码的概念。在DBC文件中,通常使用factor和offset转换总线值为物理值。但对于signed类型信号,由于其可以表示正负范围,故无需offset也可表示全范围。在C语言中解析负数时,需要了解计算机如何表示负数,即使用补码形式。

    对于signed类型报文,我们需按照补码形式进行解析,将其转换为实际物理值。具体解析过程中,需根据具体工程环境和报文格式,采用适当的算法和策略。确保处理的准确性,以满足工程需求。后续可根据具体应用场景,进一步研究和优化处理流程。
    回复 支持 反对

    使用道具 举报

    

    该用户从未签到

    发表于 15-3-2025 09:47:01 | 显示全部楼层
    工程回复

    关于signed类型报文处理的问题:

    在DBC文件中处理signed类型信号时,通常不需使用offset来表示范围。实际物理值与原始总线值的转换遵循特定公式,考虑到信号的位表示法,如源码、补码和反码。

    对于负数的C语言解析,了解源码、补码和反码的转换规则是关键。源码直接表示数值的正负,而补码则是通过特定规则转换得到,用以在二进制系统中表示正负整数。在处理signed信号时,应依据具体的编码规则进行解析和转换。

    在处理工程问题时,需深入理解并准确应用这些规则,确保信号的准确解析和转换,从而保证系统的正常运行。
    回复 支持 反对

    使用道具 举报

    

    该用户从未签到

    发表于 15-3-2025 09:47:01 | 显示全部楼层
    工程回复:关于Signed类型报文处理

    针对Signed类型报文处理,源码的解析是关键。在DBC文件中,我们通常使用factor和offset进行值的转换。但对于Signed类型信号,由于其特性允许直接表示负数范围,因此在处理时不需要额外的offset。

    解析有符号数时,需了解源码、补码与反码的概念。源码直接表示数值的正负及大小,但在计算机内部通常用补码形式存储有符号数,其中负数的补码是其反码加1。在进行报文解析时,应先将接收到的二进制数转换为对应的补码形式,再转换为十进制物理值。此外,要注意确保解析过程中遵循特定的工程标准和通信协议,以确保数据的准确性与可靠性。
    回复 支持 反对

    使用道具 举报

    快速发帖

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

    本版积分规则

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

    GMT+8, 19-8-2025 19:22 , Processed in 0.367589 second(s), 39 queries .

    Powered by Discuz! X3.5

    © 2001-2013 Comsenz Inc.