CAN信号值解析 — 算法文字描述
以下是算法实现
/*************************************************************
函数名称: can_sig_analy
函数功能: CAN信号值解析函数
输入参数:
u8_sig_start 信号起始位
u8_len 信号数据长度
U8_T data[8] 8个字节的CAN数据
输出参数: 无
返回值 :无
**************************************************************/
U32_T can_sig_analy(U8_T u8_sig_start, U8_T u8_len,U8_T data[8])
{
U8_T lsbbit = 0;//LSB所在bit位
U8_T lsbbyte = 0;//低字节所在位置
U8_T msbbyte = 0;//高字节所在位置
U8_T start = 0;//起始位置
U8_T length = 0;//信号长度
U8_T index = 0;
U32_T data_merge = 0,data_value = 0;
start = u8_sig_start;//信号起始位
length = u8_len;//信号有效数据长度
lsbbit = start & 7;//获取LSB所在bit位
lsbbyte = start >> 3;//获取低字节所在位置
msbbyte = lsbbyte - ((lsbbit + length - 1) >> 3);//获取高字节所在位置
//合并高低字节数据
for(index = msbbyte;index < (lsbbyte+1) ;index++ )
{
data_merge += data[index] << (( lsbbyte - index ) << 3);
}
data_value = data_merge >> lsbbit;//去尾
data_value = data_value & ((1 << length) - 1);//按位与(只保留有效数据)
return data_value;
}