tips:本例子使用串口先发送低字节
1、使用联合体
typedef union {
float f;
int8_t c[4];
}FLOAT2INT32;
FLOAT2INT32 float2int32;
for(i = 0 ; i < 4 ; i++){
data[byteNum++] = float2int32.c[j];
}
2、使用memcopy
uint8_t tempArr[4] = {};
memcpy((void *)&cmu_state, tempArr, 4); //cmu_state占用4字节
for(i = 0 ; i < 4 ; i++){
data[byteNum++] = tempArr[i];
}
3、直接位操作
//16位year
data[byteNum++] = CMU_selfTest.year; //截取?
data[byteNum++] = CMU_selfTest.year>>8;
1、使用联合体复制
u8 imuDataBuf[33];
uint8_t tempdataHH,tempdataH,tempdataL,tempdataLL;
for( i = 1 ; i < 33 ; i ++){
imuDataBuf[i] = SPI1_ReadWriteByte(0x00);
delay_ms(READ_DELAY_MS);
}
for( i = 0 ; i < 3 ; i++){ //arm小端模式,低在低 //且传输协议高字节先发
tempdataH = imuDataBuf[index++];
if(tempdataH && 0x80 != 0x00){ //最高位为符号位 此处注意:有符号整形传输时候,注意负数前面全部为1
tempdataHH = 0xFF;
}else{
tempdataHH = 0x00;
}
tempdataL = imuDataBuf[index++];
tempdataLL = imuDataBuf[index++];
temp = ( (tempdataHH << 24) | (tempdataH << 16) | (tempdataL << 8) | tempdataLL ) ;
imu_frame.phyGyroData[i] = temp / LSB_AfterTEM_Gyro[0];//浮点数传输标度
}
2、按位操作
uint16_t tempdataH,tempdataL;
tempdataL=SPI1_ReadWriteByte(0X00);
tempdataH=SPI1_ReadWriteByte(0X00);
mems_value[6]=(tempdataH<<8)|(tempdataL);
uint32_t tempdataHH,tempdataH,tempdataL,tempdataLL;
//采集P
tempdataLL=SPI1_ReadWriteByte(0X00);
tempdataL=SPI1_ReadWriteByte(0X00);
tempdataH=SPI1_ReadWriteByte(0X00);
tempdataHH=SPI1_ReadWriteByte(0X00);
sensor_data.P=(tempdataHH<<24)|(tempdataH<<16)|(tempdataL<<8)|(tempdataLL);
2、以量程操作
delay_us(READ_DELAY_US);
nsa_data.Cal_Tdata[0]=SPI1_ReadWriteByte(0X00);//0x08
delay_us(READ_DELAY_US);
nsa_data.Cal_Tdata[1]=SPI1_ReadWriteByte(0X00);//0x07
delay_us(READ_DELAY_US);
nsa_data.Cal_Tdata[2]=SPI1_ReadWriteByte(0X00);//0x06
nsa_data.Cal_PData = (nsa_data.Cal_Pdata[2] * 65536 + nsa_data.Cal_Pdata[1] * 256 + nsa_data.Cal_Pdata[0]);
nsa_data.Cal_TData = (nsa_data.Cal_Tdata[2] * 65536 + nsa_data.Cal_Tdata[1] * 256 + nsa_data.Cal_Tdata[0]);
//16777216是23位精度无符号的最大值,浮点的最高位也是符号位,即24位是符号位,这样可以判断是正负,然后再转化成相应的比例
if(nsa_data.Cal_PData > 8388608) { nsa_data.Cal_PData = (nsa_data.Cal_PData - 16777216)/ 8388608; }
else { nsa_data.Cal_PData = nsa_data.Cal_PData / 8388608; }