文章概述
利用联合体将发送的数据打包和位数变换
前言
通常发送的CAN数据为8个字节内容,即8个uint8_t的数组元素,但是我们所计算出或者读取到的数据通常不是8位数据,而是16位或者32位的数据以及float型。如何才能将16、32位数据快速轻松不用移位进行按位的组合和分解呢。
往下看!
一、联合体的使用
联合体是什么,我不用赘述,联合体union是一种类型,类似结构体,能将多种类型的元素存放进去,并且多个元素共享一个首地址。这就为不同位数的元素组合拼装在一起提供可能。
二、不同位数数据的拼装
1.引入
代码如下:通过将不同位的数据放到一个联合体里面,实现数据的拼装
typedef union
{
int data[2];
short u16Data[4];
char u8Data[8];
//数据打包
}c_wttk;
举个例子,如果can发来8个字节的数据,但是前(后)4个字节数据(32位)组合起来,其实才是一个完整的32位的数据。只是在发送的时候不得已将32位数据拆分成4个8位的数据。
我们在收到的时候把8个字节数据放到union联合体的数组里面,直接取出32位的data[0],就可以直接使用这个32位的数据了。经过测试,数据是对的。当然,如果数据是16位的,也可以直接提取出16位数据的数组元素。具体的代码测试过程如下:
2.代码测试
代码如下:
int main(void){
c_wttk tank;
// tank.u8Data[0]=0x12;
// tank.u8Data[1]=0x23;
// tank.u8Data[2]=0x34;
// tank.u8Data[3]=0x45;
// tank.u8Data[4]=0x56;
// tank.u8Data[5]=0x67;
// tank.u8Data[6]=0x78;
// tank.u8Data[7]=0x89;
//--------------------------------------------------------------
tank.data[0]=0x45342312;
tank.data[1]=0x89786756;
//--------------------------------------------------------------
//tank.u16Data[0]=0x2312;
//tank.u16Data[1]=0x4534;
//tank.u16Data[2]=0x6756;
//tank.u16Data[3]=0x8978;
printf("%x\n %x\n%x\n%x\n",tank.u16Data[0],tank.u16Data[1],tank.u16Data[2],tank.u16Data[3]);
//printf("%x\n-%x",tank.data[0],tank.data[1]);
//printf("%x\n,%x\n,%x\n,%x\n---",tank.u8Data[0],tank.u8Data[1],tank.u8Data[2],tank.u8Data[3]);
//printf("%x\n,%x\n,%x\n,%x",tank.u8Data[4],tank.u8Data[5],tank.u8Data[6],tank.u8Data[7]);
return 0;
}
这样就可以啦,还有1点我们要注意,就是以16进制进行32位数据的摆放时,需要注意对齐(大小端模式),stm32的芯片,通常小端模式,低位在前的数据放到数组的低地址。
解释
本文为我的一个总结稿,我感觉挺有用的,所以分享一下,如果不懂可以评论哦。上面介绍了,发过来的数据可以组装,我们也可以在要发送数据的时候将数据进行拆分,即将1个32位的数据拆分成4个8位数据。