一、信号来源
二、C中变量定义和信号处理
一、信号来源
信号来自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;
}
}
显示处理:根据正负号标志位去处理就好。
总结:以上是个人的一个简单梳理,如有疑问,欢迎讨论。
个人还是比较喜欢第二种方法,就是无符号的方法,祝好~