• 429查看
  • 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

    快速发帖

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

    本版积分规则

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

    GMT+8, 1-2-2025 12:49 , Processed in 0.265795 second(s), 32 queries .

    Powered by Discuz! X3.5

    © 2001-2013 Comsenz Inc.