汽车CAN信号处理篇---C编译器中的负数处理

一、信号来源
二、C中变量定义和信号处理

一、信号来源
信号来自CAN网络
CAN矩阵1、温度信号是一个CAN信号,解析CAN信号后液晶上显示轮胎温度。
2、无效值为0xFF,当信号为无效值时,软件上识别为0,或者显示“—”,与信号丢失的处理方法相同。
3、offset为-40。CAN矩阵中,一般信号的Data Type都是Unsigned,个人理解是在信号传输时无符号不容易出现解析方面的错误。
4、信号长度为8,也就是一个字节长度。其真实值能覆盖的范围为0-255(dec),0x00-0xFF(hex)。其物理值能覆盖的范围为-40~215度。
5、结合实际需求,轮胎温度是需要有零下温度的显示。

二、C中变量定义和信号处理
1、既然需要有负数的显示,那么有两种思路,(1)把C程序中的变量直接定义成有符号数 (2)把C程序中的变量定义成无符号数,再加一个用于区分正负的标志位。

2、对于第一种思路:
定义:signed int FLTireTemp
C程序中根据CAN值是否大于等于40做区分处理,对于CAN值大于等于40的值,直接赋值即可,以下讨论CAN值小于40的值
测试如下:当CAN信号为0x0C时,实际值为0x0C,物理值温度应该显示为12-40=-28度,也就是零下28度。
C程序中处理:FLTireTemp = CAN值 ( 0x0C ) - 40,编译平台为KEIL,实际调试结果如下:
在这里插入图片描述
可以看到,FLTireTemp = 0x FFFF FFE4 。
因为本需求中,温度的范围只有 -40~215,可以简单判断,if FLTireTemp > 0x FFFF,显示温度的首位为一个负号,值 = 0xFFFF FFFF - FLTireTemp,综合起来,温度为 -28.

3、对于第二种思路:
定义如下:unsigned int FLTireTemp
附带一个正负号标志位: byte isFLTireTempNegative;
C程序处理:

            if(can_app_msg.idx3A2_FLTireTemp == 0xFF){//左前轮温度
                FLTireTemp = 0;
            }else{
                if(can_app_msg.idx3A2_FLTireTemp >= 40){
                    isFLTireTempNegative = 0;
                    FLTireTemp = can_app_msg.idx3A2_FLTireTemp - 40;
                }else{
                    isFLTireTempNegative = 1;
                    FLTireTemp = 40 - can_app_msg.idx3A2_FLTireTemp;
                }
            }

显示处理:根据正负号标志位去处理就好。

总结:以上是个人的一个简单梳理,如有疑问,欢迎讨论。
个人还是比较喜欢第二种方法,就是无符号的方法,祝好~

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值