/****
*使用前需要用CAN数据接收函数把不同的can数据统一存放在CAN数据存储结构体数组 can_rx_msg_record 中
*通过对CANIN遍历查询是否有一致的CANID
*查询到一致CANID后对数据进行切割
*****/
twai_message_t can_rx_msg_record[50];
/*************************************************
* @desc : intel格式CAN数据截取
* @param : byte:CAN数据数组
* begaincn:截取数据起始位
* len:截取数据长度
* @return: 截取数据值
*************************************************/
uint16_t inteldataChange(uint8_t* byte,uint8_t begaincn,uint8_t len)
{
uint16_t cachdata=0;
uint8_t i=0;
for(i=0;i<len;i++)
{
cachdata+=pow(2,i);
}
// printf("cachdata is %x \r\n",cachdata);
return ((*(uint64_t *)byte >> begaincn) &cachdata);
}
/*************************************************
* @desc : motorola lsb数据截取
* @param : byte:CAN数据数组
* begaincn:截取数据起始位
* len:截取数据长度
* @return: 截取数据值
*************************************************/
uint16_t Motorola_dataChange(uint8_t* byte,uint8_t begaincn,uint8_t len)
{
uint16_t cachdata=0;
uint32_t bytecach=0;
uint8_t i=0;
uint8_t cn,dn;
for(i=0;i<len;i++)
{
cachdata+=pow(2,i);
}
cn = begaincn / 8;
dn = begaincn % 8;
if(cn > 1)
bytecach = byte[cn] | (byte[cn-1]<<8) | (byte[cn-2]<<16);
else if(cn > 0)
bytecach = byte[cn] | (byte[cn-1]<<8);
else
bytecach = byte[cn];
// printf("cachdata is %x \r\n",cachdata);
return ((bytecach >> dn) &cachdata);
}
/*************************************************
* @desc : 遍历查询CANID,并进行数据截取
* @param : canid:CAN数据ID
* byte:CAN数据数组
* begaincn:截取数据起始位
* len:截取数据长度
* @return: 截取数据值,截取失败返回0xFFFF
*************************************************/
uint16_t canid_dataChange(uint16_t canid,uint8_t begaincn,uint8_t len)
{
uint8_t i=0;
for(i=0;i<50;i++)
{
if(canid == can_rx_msg_record[i].identifier)
{
return Motorola_dataChange(can_rx_msg_record[i].data,begaincn,len);
}
}
return 0xFFFF;
}
/*************************************************
* @desc : 遍历查询CANID,并进行数据截取()
* @param : canid:CAN数据ID
* byte:CAN数据数组
* begaincn:截取数据起始位
* len:截取数据长度
* can_accuracy:CAN数据精确度
* GB_accuracy:国标数据精确度
* can_offset:CAN数据偏移量
* GB_offset:国标数据偏移量
* @return: 截取数据值,截取失败返回0xFFFF
*************************************************/
uint16_t findCan_sendValue(uint32_t canID,uint8_t begaincn,uint8_t len,float can_accuracy,float GB_accuracy,int can_offset,int GB_offset)
{
uint8_t i=0;
uint16_t cachdata;
for(i=0;i<50;i++)
{
if(canID == can_rx_msg_record[i].identifier)
{
cachdata = dataChange(can_rx_msg_record[i].data,begaincn,len);
if((can_accuracy == GB_accuracy) && (can_offset = GB_offset))
return cachdata;
else
return (cachdata /(GB_accuracy / can_accuracy) + (can_offset - GB_offset));
}
}
return (0xFFFF);
}
CAN数据截取
最新推荐文章于 2023-06-06 14:42:17 发布